commit 16b037c409dcd2e6dca11e0ce61384bc52dbb78d parent 31448cad496eccb7b6afb13014e782e28f84dc41 Author: Lando <lando@lando.test> Date: Mon, 8 Dec 2025 21:58:28 +0000 Merge autoland to mozilla-central Diffstat:
69 files changed, 2380 insertions(+), 1612 deletions(-)
diff --git a/browser/components/customkeys/CustomKeysParent.sys.mjs b/browser/components/customkeys/CustomKeysParent.sys.mjs @@ -6,6 +6,13 @@ import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; import { CustomKeys } from "resource:///modules/CustomKeys.sys.mjs"; import { ShortcutUtils } from "resource://gre/modules/ShortcutUtils.sys.mjs"; +const KEY_NAMES_TO_CODES = { + ArrowDown: "VK_DOWN", + ArrowLeft: "VK_LEFT", + ArrowRight: "VK_RIGHT", + ArrowUp: "VK_UP", +}; + /** * Actor implementation for about:keyboard. */ @@ -182,10 +189,18 @@ export class CustomKeysParent extends JSWindowActorParent { this.sendAsyncMessage("CustomKeys:CapturedKey", data); return; } + data.isValid = true; if (event.key.length == 1) { data.key = event.key.toUpperCase(); + if (!modifiers.length || (event.shiftKey && modifiers.length == 1)) { + // This is a printable character; e.g. a letter, number or punctuation + // mark. That's not a valid shortcut key. + data.isValid = false; + } } else { - data.keycode = ShortcutUtils.getKeycodeAttribute(event.key); + data.keycode = + KEY_NAMES_TO_CODES[event.key] ?? + ShortcutUtils.getKeycodeAttribute(event.key); } data.shortcut = this.prettifyShortcut(data); this.sendAsyncMessage("CustomKeys:CapturedKey", data); diff --git a/browser/components/customkeys/content/customkeys.js b/browser/components/customkeys/content/customkeys.js @@ -152,6 +152,11 @@ async function onKey({ data }) { input.select(); return; } + if (!data.isValid) { + input.value = await document.l10n.formatValue("customkeys-key-invalid"); + input.select(); + return; + } if (await maybeHandleConflict(data)) { const newData = await RPMSendQuery("CustomKeys:ChangeKey", data); updateKey(row, newData); diff --git a/browser/components/customkeys/tests/browser/browser_aboutKeyboard.js b/browser/components/customkeys/tests/browser/browser_aboutKeyboard.js @@ -242,6 +242,13 @@ addAboutKbTask(async function testChange(tab) { 1, "Correct telemetry for change action" ); + info(`Pressing ${consts.unusedKey}`); + EventUtils.synthesizeKey(consts.unusedKey, {}, window); + await SpecialPowers.spawn(tab, [consts], async _consts => { + await content.selected; + is(content.input.value, "Invalid", "Input shows invalid"); + content.selected = ContentTaskUtils.waitForEvent(content.input, "select"); + }); info(`Pressing ${consts.unusedModifiersDisplay}`); EventUtils.synthesizeKey(...consts.unusedModifiersArgs, window); await SpecialPowers.spawn(tab, [consts], async _consts => { @@ -251,6 +258,13 @@ addAboutKbTask(async function testChange(tab) { _consts.unusedModifiersDisplay, "Input shows modifiers as they're pressed" ); + content.selected = ContentTaskUtils.waitForEvent(content.input, "select"); + }); + info(`Pressing Shift+${consts.unusedKey}`); + EventUtils.synthesizeKey(consts.unusedKey, { shiftKey: true }, window); + await SpecialPowers.spawn(tab, [consts], async _consts => { + await content.selected; + is(content.input.value, "Invalid", "Input shows invalid"); info(`Pressing ${_consts.unusedDisplay}`); content.focused = ContentTaskUtils.waitForEvent(content.change, "focus"); }); @@ -735,3 +749,45 @@ addAboutKbTask(async function testFunctionKey(tab) { }); CustomKeys.resetAll(); }); + +// Test that changing to an arrow key works correctly. +addAboutKbTask(async function testFunctionKey(tab) { + await SpecialPowers.spawn(tab, [consts], async _consts => { + content.backRow = content.document.querySelector( + '.key[data-id="goBackKb"]' + ); + ok( + !content.backRow.classList.contains("customized"), + "goBackKb is not customized" + ); + info("Clicking Change for goBackKb"); + content.input = content.backRow.querySelector(".new"); + let focused = ContentTaskUtils.waitForEvent(content.input, "focus"); + content.change = content.backRow.querySelector(".change"); + content.change.click(); + await focused; + ok(true, "New key input got focus"); + content.focused = ContentTaskUtils.waitForEvent(content.change, "focus"); + }); + await Services.fog.testFlushAllChildren(); + is( + Glean.browserCustomkeys.actions.change.testGetValue(), + 6, + "Correct telemetry for change action" + ); + info(`Pressing ${consts.backDisplay}`); + EventUtils.synthesizeKey(...consts.backArgs, window); + await SpecialPowers.spawn(tab, [consts], async _consts => { + await content.focused; + ok(true, "Change button got focus"); + ok( + !content.backRow.classList.contains("customized"), + "goBackKb is not customized" + ); + is( + content.backRow.children[1].textContent, + _consts.backDisplay, + "Key is the default key" + ); + }); +}); diff --git a/browser/components/customkeys/tests/browser/head.js b/browser/components/customkeys/tests/browser/head.js @@ -17,6 +17,9 @@ const consts = { downloadsDisplay: (isMac && "⌘J") || (isLinux && "Ctrl+Shift+Y") || "Ctrl+J", // key_newNavigator newWindowDisplay: isMac ? "⌘N" : "Ctrl+N", + // goBackKb + backDisplay: isMac ? "⌘←" : "Alt+Left Arrow", + backArgs: ["KEY_ArrowLeft", { accelKey: isMac, altKey: !isMac }], // The following unused* constants specify a key combination which is unused by // default. This will need to be updated if this key combination is assigned to diff --git a/browser/locales/en-US/browser/customkeys.ftl b/browser/locales/en-US/browser/customkeys.ftl @@ -40,3 +40,6 @@ customkeys-nav-reload-skip-cache = Reload (Override Cache) customkeys-nav-stop = Stop customkeys-caution-message = This feature is experimental and may not work as expected. + +# Displayed in the new key field when the key that was pressed isn't valid. +customkeys-key-invalid = Invalid diff --git a/browser/locales/l10n-changesets.json b/browser/locales/l10n-changesets.json @@ -15,7 +15,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "af": { "pin": false, @@ -33,7 +33,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "an": { "pin": false, @@ -51,7 +51,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ar": { "pin": false, @@ -69,7 +69,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ast": { "pin": false, @@ -87,7 +87,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "az": { "pin": false, @@ -105,7 +105,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "be": { "pin": false, @@ -123,7 +123,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "bg": { "pin": false, @@ -141,7 +141,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "bn": { "pin": false, @@ -159,7 +159,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "bo": { "pin": false, @@ -177,7 +177,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "br": { "pin": false, @@ -195,7 +195,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "brx": { "pin": false, @@ -213,7 +213,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "bs": { "pin": false, @@ -231,7 +231,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ca": { "pin": false, @@ -249,7 +249,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ca-valencia": { "pin": false, @@ -267,7 +267,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "cak": { "pin": false, @@ -285,7 +285,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ckb": { "pin": false, @@ -303,7 +303,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "cs": { "pin": false, @@ -321,7 +321,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "cy": { "pin": false, @@ -339,7 +339,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "da": { "pin": false, @@ -357,7 +357,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "de": { "pin": false, @@ -375,7 +375,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "dsb": { "pin": false, @@ -393,7 +393,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "el": { "pin": false, @@ -411,7 +411,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "en-CA": { "pin": false, @@ -429,7 +429,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "en-GB": { "pin": false, @@ -447,7 +447,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "eo": { "pin": false, @@ -465,7 +465,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-AR": { "pin": false, @@ -483,7 +483,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-CL": { "pin": false, @@ -501,7 +501,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-ES": { "pin": false, @@ -519,7 +519,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-MX": { "pin": false, @@ -537,7 +537,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "et": { "pin": false, @@ -555,7 +555,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "eu": { "pin": false, @@ -573,7 +573,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fa": { "pin": false, @@ -591,7 +591,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ff": { "pin": false, @@ -609,7 +609,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fi": { "pin": false, @@ -627,7 +627,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fr": { "pin": false, @@ -645,7 +645,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fur": { "pin": false, @@ -663,7 +663,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fy-NL": { "pin": false, @@ -681,7 +681,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ga-IE": { "pin": false, @@ -699,7 +699,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gd": { "pin": false, @@ -717,7 +717,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gl": { "pin": false, @@ -735,7 +735,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gn": { "pin": false, @@ -753,7 +753,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gu-IN": { "pin": false, @@ -771,7 +771,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "he": { "pin": false, @@ -789,7 +789,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hi-IN": { "pin": false, @@ -807,7 +807,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hr": { "pin": false, @@ -825,7 +825,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hsb": { "pin": false, @@ -843,7 +843,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hu": { "pin": false, @@ -861,7 +861,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hy-AM": { "pin": false, @@ -879,7 +879,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hye": { "pin": false, @@ -897,7 +897,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ia": { "pin": false, @@ -915,7 +915,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "id": { "pin": false, @@ -933,7 +933,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "is": { "pin": false, @@ -951,7 +951,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "it": { "pin": false, @@ -969,7 +969,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ja": { "pin": false, @@ -985,7 +985,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ja-JP-mac": { "pin": false, @@ -993,7 +993,7 @@ "macosx64", "macosx64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ka": { "pin": false, @@ -1011,7 +1011,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "kab": { "pin": false, @@ -1029,7 +1029,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "kk": { "pin": false, @@ -1047,7 +1047,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "km": { "pin": false, @@ -1065,7 +1065,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "kn": { "pin": false, @@ -1083,7 +1083,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ko": { "pin": false, @@ -1101,7 +1101,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lij": { "pin": false, @@ -1119,7 +1119,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lo": { "pin": false, @@ -1137,7 +1137,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lt": { "pin": false, @@ -1155,7 +1155,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ltg": { "pin": false, @@ -1173,7 +1173,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lv": { "pin": false, @@ -1191,7 +1191,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "meh": { "pin": false, @@ -1209,7 +1209,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "mk": { "pin": false, @@ -1227,7 +1227,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ml": { "pin": false, @@ -1245,7 +1245,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "mr": { "pin": false, @@ -1263,7 +1263,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ms": { "pin": false, @@ -1281,7 +1281,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "my": { "pin": false, @@ -1299,7 +1299,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "nb-NO": { "pin": false, @@ -1317,7 +1317,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ne-NP": { "pin": false, @@ -1335,7 +1335,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "nl": { "pin": false, @@ -1353,7 +1353,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "nn-NO": { "pin": false, @@ -1371,7 +1371,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "oc": { "pin": false, @@ -1389,7 +1389,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pa-IN": { "pin": false, @@ -1407,7 +1407,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pl": { "pin": false, @@ -1425,7 +1425,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pt-BR": { "pin": false, @@ -1443,7 +1443,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pt-PT": { "pin": false, @@ -1461,7 +1461,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "rm": { "pin": false, @@ -1479,7 +1479,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ro": { "pin": false, @@ -1497,7 +1497,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ru": { "pin": false, @@ -1515,7 +1515,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sat": { "pin": false, @@ -1533,7 +1533,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sc": { "pin": false, @@ -1551,7 +1551,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "scn": { "pin": false, @@ -1569,7 +1569,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sco": { "pin": false, @@ -1587,7 +1587,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "si": { "pin": false, @@ -1605,7 +1605,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sk": { "pin": false, @@ -1623,7 +1623,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "skr": { "pin": false, @@ -1641,7 +1641,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sl": { "pin": false, @@ -1659,7 +1659,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "son": { "pin": false, @@ -1677,7 +1677,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sq": { "pin": false, @@ -1695,7 +1695,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sr": { "pin": false, @@ -1713,7 +1713,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sv-SE": { "pin": false, @@ -1731,7 +1731,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "szl": { "pin": false, @@ -1749,7 +1749,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ta": { "pin": false, @@ -1767,7 +1767,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "te": { "pin": false, @@ -1785,7 +1785,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "tg": { "pin": false, @@ -1803,7 +1803,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "th": { "pin": false, @@ -1821,7 +1821,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "tl": { "pin": false, @@ -1839,7 +1839,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "tr": { "pin": false, @@ -1857,7 +1857,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "trs": { "pin": false, @@ -1875,7 +1875,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "uk": { "pin": false, @@ -1893,7 +1893,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ur": { "pin": false, @@ -1911,7 +1911,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "uz": { "pin": false, @@ -1929,7 +1929,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "vi": { "pin": false, @@ -1947,7 +1947,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "wo": { "pin": false, @@ -1965,7 +1965,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "xh": { "pin": false, @@ -1983,7 +1983,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "zh-CN": { "pin": false, @@ -2001,7 +2001,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "zh-TW": { "pin": false, @@ -2019,6 +2019,6 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" } } \ No newline at end of file diff --git a/devtools/client/dom/content/dom-view.js b/devtools/client/dom/content/dom-view.js @@ -28,14 +28,17 @@ const store = createStore(reducers); * for rendering the content. It renders the top level ReactJS * component: the MainFrame. */ -function DomView(localStore) { - addEventListener("devtools/chrome/message", this.onMessage.bind(this), true); - - // Make it local so, tests can access it. - this.store = localStore; -} +class DomView { + constructor(localStore) { + addEventListener( + "devtools/chrome/message", + this.onMessage.bind(this), + true + ); -DomView.prototype = { + // Make it local so, tests can access it. + this.store = localStore; + } initialize(rootGrip) { const content = document.querySelector("#content"); const mainFrame = MainFrame({ @@ -52,7 +55,7 @@ DomView.prototype = { ); this.mainFrame = ReactDOM.render(provider, content); - }, + } onMessage(event) { const data = event.data; @@ -61,8 +64,8 @@ DomView.prototype = { if (typeof this[method] == "function") { this[method](data.args); } - }, -}; + } +} // Construct DOM panel view object and expose it to tests. // Tests can access it through: |panel.panelWin.view| diff --git a/devtools/client/dom/content/grip-provider.js b/devtools/client/dom/content/grip-provider.js @@ -10,17 +10,15 @@ const { Property, } = require("resource://devtools/client/dom/content/reducers/grips.js"); -// Implementation -function GripProvider(grips, dispatch) { - this.grips = grips; - this.dispatch = dispatch; -} - /** * This object provides data for the tree displayed in the tooltip * content. */ -GripProvider.prototype = { +class GripProvider { + constructor(grips, dispatch) { + this.grips = grips; + this.dispatch = dispatch; + } /** * Fetches properties from the backend. These properties might be * displayed as child objects in e.g. a tree UI widget. @@ -43,7 +41,7 @@ GripProvider.prototype = { } return props; - }, + } hasChildren(object) { if (object instanceof Property) { @@ -71,7 +69,7 @@ GripProvider.prototype = { } return null; - }, + } getValue(object) { if (object instanceof Property) { @@ -82,21 +80,21 @@ GripProvider.prototype = { } return object; - }, + } getLabel(object) { return object instanceof Property ? object.name : null; - }, + } getKey(object) { return object instanceof Property ? object.key : null; - }, + } getType(object) { const grip = object?.getGrip ? object.getGrip() : object; return grip.class ? grip.class : ""; - }, -}; + } +} // Exports from this module exports.GripProvider = GripProvider; diff --git a/devtools/client/framework/devtools.js b/devtools/client/framework/devtools.js @@ -77,7 +77,7 @@ const DEVTOOLS_ALWAYS_ON_TOP = "devtools.toolbox.alwaysOnTop"; * DevTools is a class that represents a set of developer tools, it holds a * set of tools and keeps track of open toolboxes in the browser. */ -function DevTools() { +class DevTools { // We should be careful to always load a unique instance of this module: // - only in the parent process // - only in the "shared JSM global" spawn by mozJSModuleLoader @@ -86,45 +86,45 @@ function DevTools() { // DevTools module loader named "DevTools (Server Module loader)". // Also the realm location is appended the loading callsite, so only check // the beginning of the string. - if ( - Services.appinfo.processType != Services.appinfo.PROCESS_TYPE_DEFAULT || - !Cu.getRealmLocation(globalThis).startsWith(DEFAULT_SANDBOX_NAME) - ) { - throw new Error( - "This module should be loaded in the parent process only, in the shared global." - ); - } + constructor() { + if ( + Services.appinfo.processType != Services.appinfo.PROCESS_TYPE_DEFAULT || + !Cu.getRealmLocation(globalThis).startsWith(DEFAULT_SANDBOX_NAME) + ) { + throw new Error( + "This module should be loaded in the parent process only, in the shared global." + ); + } - this._tools = new Map(); // Map<toolId, tool> - this._themes = new Map(); // Map<themeId, theme> - this._toolboxesPerCommands = new Map(); // Map<commands, toolbox> - // List of toolboxes that are still in process of creation - this._creatingToolboxes = new Map(); // Map<commands, toolbox Promise> + this._tools = new Map(); // Map<toolId, tool> + this._themes = new Map(); // Map<themeId, theme> + this._toolboxesPerCommands = new Map(); // Map<commands, toolbox> + // List of toolboxes that are still in process of creation + this._creatingToolboxes = new Map(); // Map<commands, toolbox Promise> - EventEmitter.decorate(this); - this._telemetry = new Telemetry(); + EventEmitter.decorate(this); + this._telemetry = new Telemetry(); - // List of all commands of debugged local Web Extension. - this._commandsPromiseByWebExtId = new Map(); // Map<extensionId, commands> + // List of all commands of debugged local Web Extension. + this._commandsPromiseByWebExtId = new Map(); // Map<extensionId, commands> - // Listen for changes to the theme pref. - this._onThemeChanged = this._onThemeChanged.bind(this); - addThemeObserver(this._onThemeChanged); + // Listen for changes to the theme pref. + this._onThemeChanged = this._onThemeChanged.bind(this); + addThemeObserver(this._onThemeChanged); - // This is important step in initialization codepath where we are going to - // start registering all default tools and themes: create menuitems, keys, emit - // related events. - this.registerDefaults(); + // This is important step in initialization codepath where we are going to + // start registering all default tools and themes: create menuitems, keys, emit + // related events. + this.registerDefaults(); - // Register this DevTools instance on the DevToolsShim, which is used by non-devtools - // code to interact with DevTools. - DevToolsShim.register(this); -} + // Register this DevTools instance on the DevToolsShim, which is used by non-devtools + // code to interact with DevTools. + DevToolsShim.register(this); + } -DevTools.prototype = { // The windowtype of the main window, used in various tools. This may be set // to something different by other gecko apps. - chromeWindowType: "navigator:browser", + chromeWindowType = "navigator:browser"; registerDefaults() { // Ensure registering items in the sorted order (getDefault* functions @@ -133,7 +133,7 @@ DevTools.prototype = { this.getDefaultThemes().forEach(definition => this.registerTheme(definition) ); - }, + } unregisterDefaults() { for (const definition of this.getToolDefinitionArray()) { @@ -142,7 +142,7 @@ DevTools.prototype = { for (const definition of this.getThemeDefinitionArray()) { this.unregisterTheme(definition.id); } - }, + } /** * Register a new developer tool. @@ -188,7 +188,7 @@ DevTools.prototype = { this._tools.set(toolId, toolDefinition); this.emit("tool-registered", toolId); - }, + } /** * Removes all tools that match the given |toolId| @@ -206,7 +206,7 @@ DevTools.prototype = { if (!isQuitApplication) { this.emit("tool-unregistered", toolId); } - }, + } /** * Sorting function used for sorting tools based on their ordinals. @@ -215,11 +215,11 @@ DevTools.prototype = { const o1 = typeof d1.ordinal == "number" ? d1.ordinal : MAX_ORDINAL; const o2 = typeof d2.ordinal == "number" ? d2.ordinal : MAX_ORDINAL; return o1 - o2; - }, + } getDefaultTools() { return DefaultTools.sort(this.ordinalSort); - }, + } getAdditionalTools() { const tools = []; @@ -229,11 +229,11 @@ DevTools.prototype = { } } return tools.sort(this.ordinalSort); - }, + } getDefaultThemes() { return DefaultThemes.sort(this.ordinalSort); - }, + } /** * Get a tool definition if it exists and is enabled. @@ -255,7 +255,7 @@ DevTools.prototype = { const enabled = Services.prefs.getBoolPref(tool.visibilityswitch, true); return enabled ? tool : null; - }, + } /** * Allow ToolBoxes to get at the list of tools that they should populate @@ -274,7 +274,7 @@ DevTools.prototype = { } return tools; - }, + } /** * Tools have an inherent ordering that can't be represented in a Map so @@ -294,7 +294,7 @@ DevTools.prototype = { } return definitions.sort(this.ordinalSort); - }, + } /** * Returns the name of the current theme for devtools. @@ -304,7 +304,7 @@ DevTools.prototype = { */ getTheme() { return getTheme(); - }, + } /** * Returns the name of the default (auto) theme for devtools. @@ -313,14 +313,14 @@ DevTools.prototype = { */ getAutoTheme() { return getAutoTheme(); - }, + } /** * Called when the developer tools theme changes. */ _onThemeChanged() { this.emit("theme-changed", getTheme()); - }, + } /** * Register a new theme for developer tools toolbox. @@ -358,7 +358,7 @@ DevTools.prototype = { this._themes.set(themeId, themeDefinition); this.emit("theme-registered", themeId); - }, + } /** * Removes an existing theme from the list of registered themes. @@ -397,7 +397,7 @@ DevTools.prototype = { } this._themes.delete(themeId); - }, + } /** * Get a theme definition if it exists. @@ -414,7 +414,7 @@ DevTools.prototype = { return null; } return theme; - }, + } /** * Get map of registered themes. @@ -432,7 +432,7 @@ DevTools.prototype = { } return themes; - }, + } /** * Get registered themes definitions sorted by ordinal value. @@ -450,7 +450,7 @@ DevTools.prototype = { } return definitions.sort(this.ordinalSort); - }, + } /** * Called from SessionStore.sys.mjs in mozilla-central when saving the current state. @@ -463,7 +463,7 @@ DevTools.prototype = { BrowserConsoleManager.getBrowserConsoleSessionState(); state.browserToolbox = lazy.BrowserToolboxLauncher.getBrowserToolboxSessionState(); - }, + } /** * Restore the devtools session state as provided by SessionStore. @@ -476,13 +476,13 @@ DevTools.prototype = { if (browserConsole && !BrowserConsoleManager.getBrowserConsole()) { await BrowserConsoleManager.toggleBrowserConsole(); } - }, + } /** * Boolean, true, if we never opened a toolbox. * Used to implement the telemetry tracking toolbox opening. */ - _firstShowToolbox: true, + _firstShowToolbox = true; /** * Show a Toolbox for a given "commands" (either by creating a new one, or if a @@ -586,7 +586,7 @@ DevTools.prototype = { ); return toolbox; - }, + } /** * Show the toolbox for a given tab. If a toolbox already exists for this tab @@ -644,7 +644,7 @@ DevTools.prototype = { reason, hostOptions, }); - }, + } /** * Open a Toolbox in a dedicated top-level window for debugging a local WebExtension. @@ -681,7 +681,7 @@ DevTools.prototype = { }, toolId, }); - }, + } /** * Log telemetry related to toolbox opening. @@ -715,7 +715,7 @@ DevTools.prototype = { "first_panel", panelName ); - }, + } makeToolIdHumanReadable(toolId) { if (/^[0-9a-fA-F]{40}_temporary-addon/.test(toolId)) { @@ -735,7 +735,7 @@ DevTools.prototype = { } return toolId; - }, + } /** * Unconditionally create a new Toolbox instance for the provided commands. @@ -764,7 +764,7 @@ DevTools.prototype = { this.emit("toolbox-ready", toolbox); return toolbox; - }, + } /** * Return the toolbox for a given commands object. @@ -777,7 +777,7 @@ DevTools.prototype = { */ getToolboxForCommands(commands) { return this._toolboxesPerCommands.get(commands); - }, + } /** * TabDescriptorFront requires a synchronous method and don't have a reference to its @@ -790,7 +790,7 @@ DevTools.prototype = { } } return null; - }, + } /** * Retrieve an existing toolbox for the provided tab if it was created before. @@ -805,7 +805,7 @@ DevTools.prototype = { return this.getToolboxes().find( t => t.commands.descriptorFront.localTab === tab ); - }, + } /** * Close the toolbox for a given tab. @@ -825,7 +825,7 @@ DevTools.prototype = { return; } await toolbox.destroy(); - }, + } /** * Compatibility layer for web-extensions. Used by DevToolsShim for @@ -838,7 +838,7 @@ DevTools.prototype = { */ createCommandsForTabForWebExtension(tab) { return CommandsFactory.forTab(tab, { isWebExtension: true }); - }, + } /** * Compatibility layer for web-extensions. Used by DevToolsShim for @@ -849,7 +849,7 @@ DevTools.prototype = { BrowserConsoleManager, } = require("resource://devtools/client/webconsole/browser-console-manager.js"); BrowserConsoleManager.openBrowserConsoleOrFocus(); - }, + } /** * Called from the DevToolsShim, used by nsContextMenu.js. @@ -906,7 +906,7 @@ DevTools.prototype = { // Now that the node has been selected, wait until the inspector is // fully updated. await inspector.once("inspector-updated"); - }, + } /** * Called from the DevToolsShim, used by nsContextMenu.js. @@ -940,7 +940,7 @@ DevTools.prototype = { const onSelected = a11yPanel.once("new-accessible-front-selected"); a11yPanel.selectAccessibleForNode(nodeFront, "browser-context-menu"); await onSelected; - }, + } /** * Either the DevTools Loader has been destroyed or firefox is shutting down. @@ -978,7 +978,7 @@ DevTools.prototype = { // Cleaning down the toolboxes: i.e. // for (let [, toolbox] of this._toolboxesPerCommands) toolbox.destroy(); // Is taken care of by the gDevToolsBrowser.forgetBrowserWindow - }, + } /** * Returns the array of the existing toolboxes. @@ -988,7 +988,7 @@ DevTools.prototype = { */ getToolboxes() { return Array.from(this._toolboxesPerCommands.values()); - }, + } /** * Returns whether the given tab has toolbox. @@ -1002,7 +1002,7 @@ DevTools.prototype = { return this.getToolboxes().some( t => t.commands.descriptorFront.localTab === tab ); - }, -}; + } +} const gDevTools = (exports.gDevTools = new DevTools()); diff --git a/devtools/client/framework/toolbox-host-manager.js b/devtools/client/framework/toolbox-host-manager.js @@ -54,41 +54,40 @@ const LAST_HOST = "devtools.toolbox.host"; const PREVIOUS_HOST = "devtools.toolbox.previousHost"; let ID_COUNTER = 1; -function ToolboxHostManager(commands, hostType, hostOptions) { - this.commands = commands; +class ToolboxHostManager { + constructor(commands, hostType, hostOptions) { + this.commands = commands; - // When debugging a local tab, we keep a reference of the current tab into which the toolbox is displayed. - // This will only change from the descriptor's localTab when we start debugging popups (i.e. window.open). - this.currentTab = this.commands.descriptorFront.localTab; + // When debugging a local tab, we keep a reference of the current tab into which the toolbox is displayed. + // This will only change from the descriptor's localTab when we start debugging popups (i.e. window.open). + this.currentTab = this.commands.descriptorFront.localTab; - // Keep the previously instantiated Host for all tabs where we displayed the Toolbox. - // This will only be useful when we start debugging popups (i.e. window.open). - // This is used to re-use the previous host instance when we re-select the original tab - // we were debugging before the popup opened. - this.hostPerTab = new Map(); + // Keep the previously instantiated Host for all tabs where we displayed the Toolbox. + // This will only be useful when we start debugging popups (i.e. window.open). + // This is used to re-use the previous host instance when we re-select the original tab + // we were debugging before the popup opened. + this.hostPerTab = new Map(); - this.frameId = ID_COUNTER++; + this.frameId = ID_COUNTER++; - if (!hostType) { - hostType = Services.prefs.getCharPref(LAST_HOST); - if (!Hosts[hostType]) { - // If the preference value is unexpected, restore to the default value. - Services.prefs.clearUserPref(LAST_HOST); + if (!hostType) { hostType = Services.prefs.getCharPref(LAST_HOST); + if (!Hosts[hostType]) { + // If the preference value is unexpected, restore to the default value. + Services.prefs.clearUserPref(LAST_HOST); + hostType = Services.prefs.getCharPref(LAST_HOST); + } } + this.eventController = new AbortController(); + this.host = this.createHost(hostType, hostOptions); + this.hostType = hostType; + // List of event which are collected when a new host is created for a popup + // from `switchHostToTab` method. + this.collectPendingMessages = null; + this.setMinWidthWithZoom = this.setMinWidthWithZoom.bind(this); + this._onMessage = this._onMessage.bind(this); + Services.prefs.addObserver(ZOOM_VALUE_PREF, this.setMinWidthWithZoom); } - this.eventController = new AbortController(); - this.host = this.createHost(hostType, hostOptions); - this.hostType = hostType; - // List of event which are collected when a new host is created for a popup - // from `switchHostToTab` method. - this.collectPendingMessages = null; - this.setMinWidthWithZoom = this.setMinWidthWithZoom.bind(this); - this._onMessage = this._onMessage.bind(this); - Services.prefs.addObserver(ZOOM_VALUE_PREF, this.setMinWidthWithZoom); -} - -ToolboxHostManager.prototype = { /** * Create a Toolbox * @@ -130,7 +129,7 @@ ToolboxHostManager.prototype = { this.setMinWidthWithZoom(); return toolbox; - }, + } setMinWidthWithZoom() { const zoomValue = parseFloat(Services.prefs.getCharPref(ZOOM_VALUE_PREF)); @@ -153,7 +152,7 @@ ToolboxHostManager.prototype = { this.host.frame.style.minWidth = WIDTH_CHEVRON_AND_MEATBALL * zoomValue + "px"; } - }, + } _onToolboxDestroyed() { // Delay self-destruction to let the debugger complete async destruction. @@ -162,7 +161,7 @@ ToolboxHostManager.prototype = { DevToolsUtils.executeSoon(() => { this.destroy(); }); - }, + } _onMessage(event) { if (!event.data) { @@ -195,12 +194,12 @@ ToolboxHostManager.prototype = { this.host.setTitle(msg.title); break; } - }, + } postMessage(data) { const window = this.host.frame.contentWindow; window.postMessage(data, "*"); - }, + } destroy() { Services.prefs.removeObserver(ZOOM_VALUE_PREF, this.setMinWidthWithZoom); @@ -216,7 +215,7 @@ ToolboxHostManager.prototype = { this.host = null; this.hostType = null; this.commands = null; - }, + } /** * Create a host object based on the given host type. @@ -237,7 +236,7 @@ ToolboxHostManager.prototype = { } const newHost = new Hosts[hostType](this.currentTab, options); return newHost; - }, + } /** * Migrate the toolbox to a new host, while keeping it fully functional. @@ -326,7 +325,7 @@ ToolboxHostManager.prototype = { name: "switched-host", hostType, }); - }, + } /** * When we are debugging popup, we are moving around the toolbox between original tab @@ -374,7 +373,7 @@ ToolboxHostManager.prototype = { name: "switched-host-to-tab", browsingContextID: tabBrowsingContextID, }); - }, + } /** * Destroy the current host, and remove event listeners from its frame. @@ -383,6 +382,7 @@ ToolboxHostManager.prototype = { */ destroyHost() { return this.host.destroy(); - }, -}; + } +} + exports.ToolboxHostManager = ToolboxHostManager; diff --git a/devtools/shared/protocol/Response.js b/devtools/shared/protocol/Response.js @@ -12,35 +12,34 @@ var { types } = require("resource://devtools/shared/protocol/types.js"); /** * Manages a response template. - * - * @param object template - * The response template. - * @construcor */ -var Response = function (template = {}) { - this.template = template; - if (this.template instanceof RetVal && this.template.isArrayType()) { - throw Error("Arrays should be wrapped in objects"); - } +class Response { + /** + * @param {object} template + * The response template. + */ + constructor(template = {}) { + this.template = template; + if (this.template instanceof RetVal && this.template.isArrayType()) { + throw Error("Arrays should be wrapped in objects"); + } - const placeholders = findPlaceholders(template, RetVal); - if (placeholders.length > 1) { - throw Error("More than one RetVal specified in response"); - } - const placeholder = placeholders.shift(); - if (placeholder) { - this.retVal = placeholder.placeholder; - this.path = placeholder.path; + const placeholders = findPlaceholders(template, RetVal); + if (placeholders.length > 1) { + throw Error("More than one RetVal specified in response"); + } + const placeholder = placeholders.shift(); + if (placeholder) { + this.retVal = placeholder.placeholder; + this.path = placeholder.path; + } } -}; - -Response.prototype = { /** * Write a response for the given return value. * * @param val ret * The return value. - * @param object ctx + * @param {object} ctx * The object writing the response. */ write(ret, ctx) { @@ -62,14 +61,14 @@ Response.prototype = { } } return result; - }, + } /** * Read a return value from the given response. * - * @param object packet + * @param {object} packet * The response packet. - * @param object ctx + * @param {object} ctx * The object reading the response. */ read(packet, ctx) { @@ -78,40 +77,40 @@ Response.prototype = { } const v = getPath(packet, this.path); return this.retVal.read(v, ctx); - }, -}; + } +} exports.Response = Response; /** * Placeholder for return values in a response template. - * - * @param type type - * The return value should be marshalled as this type. */ -var RetVal = function (type) { - this._type = type; - // Prevent force loading all RetVal types by accessing it only when needed - loader.lazyGetter(this, "type", function () { - return types.getType(type); - }); -}; - -RetVal.prototype = { +class RetVal { + /** + * @param type type + * The return value should be marshalled as this type. + */ + constructor(type) { + this._type = type; + // Prevent force loading all RetVal types by accessing it only when needed + loader.lazyGetter(this, "type", function () { + return types.getType(type); + }); + } write(v, ctx) { return this.type.write(v, ctx); - }, + } read(v, ctx) { return this.type.read(v, ctx); - }, + } isArrayType() { // `_type` should always be a string, but a few incorrect RetVal calls // pass `0`. See Bug 1677703. return typeof this._type === "string" && this._type.startsWith("array:"); - }, -}; + } +} // Outside of protocol.js, RetVal is called as factory method, without the new keyword. exports.RetVal = function (type) { diff --git a/devtools/shared/protocol/lazy-pool.js b/devtools/shared/protocol/lazy-pool.js @@ -12,13 +12,13 @@ const { Pool } = require("devtools/shared/protocol"); * * Like the Pool, this is a protocol object that can manage the lifetime of other protocol * objects. Pools are used on both sides of the connection to help coordinate lifetimes. - * - * @param conn - * Is a DevToolsServerConnection. Must have - * addActorPool, removeActorPool, and poolFor. - * @constructor */ class LazyPool extends Pool { + /** + * @param conn + * Is a DevToolsServerConnection. Must have + * addActorPool, removeActorPool, and poolFor. + */ constructor(conn) { super(conn); } @@ -105,49 +105,49 @@ exports.createExtraActors = createExtraActors; /** * Creates an "actor-like" object which responds in the same way as an ordinary actor * but has fewer capabilities (ie, does not manage lifetimes or have it's own pool). - * - * @param factories - * An object whose own property names are the names of properties to add to - * some reply packet (say, a target actor grip or the "listTabs" response - * form), and whose own property values are actor constructor functions, as - * documented for addTargetScopedActor - * - * @param parent - * The parent TargetActor with which the new actors - * will be associated. It should support whatever API the |factories| - * constructor functions might be interested in, as it is passed to them. - * For the sake of CommonCreateExtraActors itself, it should have at least - * the following properties: - * - * - _extraActors - * An object whose own property names are factory table (and packet) - * property names, and whose values are no-argument actor constructors, - * of the sort that one can add to a Pool. - * - * - conn - * The DevToolsServerConnection in which the new actors will participate. - * - * - actorID - * The actor's name, for use as the new actors' parentID. - * @param pool - * An object which implements the protocol.js Pool interface, and has the - * following properties - * - * - manage - * a function which adds a given actor to an actor pool */ -function LazyActor(factory, parent, pool) { - this._options = factory.options; - this._parentActor = parent; - this._name = factory.name; - this._pool = pool; - - // needed for taking a place in a pool - this.typeName = factory.name; -} - -LazyActor.prototype = { +class LazyActor { + /** + * @param factory + * An object whose own property names are the names of properties to add to + * some reply packet (say, a target actor grip or the "listTabs" response + * form), and whose own property values are actor constructor functions, as + * documented for addTargetScopedActor + * + * @param parent + * The parent TargetActor with which the new actors + * will be associated. It should support whatever API the |factories| + * constructor functions might be interested in, as it is passed to them. + * For the sake of CommonCreateExtraActors itself, it should have at least + * the following properties: + * + * - _extraActors + * An object whose own property names are factory table (and packet) + * property names, and whose values are no-argument actor constructors, + * of the sort that one can add to a Pool. + * + * - conn + * The DevToolsServerConnection in which the new actors will participate. + * + * - actorID + * The actor's name, for use as the new actors' parentID. + * @param pool + * An object which implements the protocol.js Pool interface, and has the + * following properties + * + * - manage + * a function which adds a given actor to an actor pool + */ + constructor(factory, parent, pool) { + this._options = factory.options; + this._parentActor = parent; + this._name = factory.name; + this._pool = pool; + + // needed for taking a place in a pool + this.typeName = factory.name; + } loadModule(id) { const options = this._options; try { @@ -158,7 +158,7 @@ LazyActor.prototype = { `Unable to load actor module '${options.id}'\n${e.message}\n${e.stack}\n` ); } - }, + } getConstructor() { const options = this._options; @@ -179,14 +179,14 @@ LazyActor.prototype = { ); } return constructor; - }, + } /** * Return the parent pool for this lazy actor. */ getParent() { return this.conn && this.conn.poolFor(this.actorID); - }, + } /** * This will only happen if the actor is destroyed before it is created @@ -199,7 +199,7 @@ LazyActor.prototype = { if (parent) { parent.unmanage(this); } - }, + } createActor() { // Fetch the actor constructor @@ -218,5 +218,5 @@ LazyActor.prototype = { this._pool.manage(instance); return instance; - }, -}; + } +} diff --git a/devtools/shared/transport/stream-utils.js b/devtools/shared/transport/stream-utils.js @@ -60,49 +60,49 @@ function copyStream(input, output, length) { return copier.copy(); } -function StreamCopier(input, output, length) { - EventEmitter.decorate(this); - this._id = StreamCopier._nextId++; - this.input = input; - // Save off the base output stream, since we know it's async as we've required - this.baseAsyncOutput = output; - if (IOUtil.outputStreamIsBuffered(output)) { - this.output = output; - } else { - this.output = Cc[ - "@mozilla.org/network/buffered-output-stream;1" - ].createInstance(Ci.nsIBufferedOutputStream); - this.output.init(output, BUFFER_SIZE); +class StreamCopier { + static _nextId = 0; + + constructor(input, output, length) { + EventEmitter.decorate(this); + this._id = StreamCopier._nextId++; + this.input = input; + // Save off the base output stream, since we know it's async as we've required + this.baseAsyncOutput = output; + if (IOUtil.outputStreamIsBuffered(output)) { + this.output = output; + } else { + this.output = Cc[ + "@mozilla.org/network/buffered-output-stream;1" + ].createInstance(Ci.nsIBufferedOutputStream); + this.output.init(output, BUFFER_SIZE); + } + this._length = length; + this._amountLeft = length; + let _resolve; + let _reject; + this._deferred = new Promise((resolve, reject) => { + _resolve = resolve; + _reject = reject; + }); + this._deferred.resolve = _resolve; + this._deferred.reject = _reject; + + this._copy = this._copy.bind(this); + this._flush = this._flush.bind(this); + this._destroy = this._destroy.bind(this); + + // Copy promise's then method up to this object. + // Allows the copier to offer a promise interface for the simple succeed or + // fail scenarios, but also emit events (due to the EventEmitter) for other + // states, like progress. + this.then = this._deferred.then.bind(this._deferred); + this.then(this._destroy, this._destroy); + + // Stream ready callback starts as |_copy|, but may switch to |_flush| at end + // if flushing would block the output stream. + this._streamReadyCallback = this._copy; } - this._length = length; - this._amountLeft = length; - let _resolve; - let _reject; - this._deferred = new Promise((resolve, reject) => { - _resolve = resolve; - _reject = reject; - }); - this._deferred.resolve = _resolve; - this._deferred.reject = _reject; - - this._copy = this._copy.bind(this); - this._flush = this._flush.bind(this); - this._destroy = this._destroy.bind(this); - - // Copy promise's then method up to this object. - // Allows the copier to offer a promise interface for the simple succeed or - // fail scenarios, but also emit events (due to the EventEmitter) for other - // states, like progress. - this.then = this._deferred.then.bind(this._deferred); - this.then(this._destroy, this._destroy); - - // Stream ready callback starts as |_copy|, but may switch to |_flush| at end - // if flushing would block the output stream. - this._streamReadyCallback = this._copy; -} -StreamCopier._nextId = 0; - -StreamCopier.prototype = { copy() { // Dispatch to the next tick so that it's possible to attach a progress // event listener, even for extremely fast copies (like when testing). @@ -114,7 +114,7 @@ StreamCopier.prototype = { } }); return this; - }, + } _copy() { const bytesAvailable = this.input.available(); @@ -146,14 +146,14 @@ StreamCopier.prototype = { this._debug("Waiting for input stream"); this.input.asyncWait(this, 0, 0, Services.tm.currentThread); - }, + } _emitProgress() { this.emit("progress", { bytesSent: this._length - this._amountLeft, totalBytes: this._length, }); - }, + } _flush() { try { @@ -172,7 +172,7 @@ StreamCopier.prototype = { throw e; } this._deferred.resolve(); - }, + } _destroy() { this._destroy = null; @@ -180,24 +180,24 @@ StreamCopier.prototype = { this._flush = null; this.input = null; this.output = null; - }, + } // nsIInputStreamCallback onInputStreamReady() { this._streamReadyCallback(); - }, + } // nsIOutputStreamCallback onOutputStreamReady() { this._streamReadyCallback(); - }, + } _debug(msg) { // Prefix logs with the copier ID, which makes logs much easier to // understand when several copiers are running simultaneously dumpv("Copier: " + this._id + " " + msg); - }, -}; + } +} /** * Read from a stream, one byte at a time, up to the next |delimiter| diff --git a/devtools/shared/transport/worker-transport.js b/devtools/shared/transport/worker-transport.js @@ -65,23 +65,20 @@ exports.MainThreadWorkerDebuggerTransport = MainThreadWorkerDebuggerTransport; * A transport that uses a WorkerDebuggerGlobalScope to send packets from a * worker thread to the main thread. */ -function WorkerThreadWorkerDebuggerTransport(scope, id) { - this._scope = scope; - this._id = id; - this._onMessage = this._onMessage.bind(this); -} - -WorkerThreadWorkerDebuggerTransport.prototype = { - constructor: WorkerThreadWorkerDebuggerTransport, - +class WorkerThreadWorkerDebuggerTransport { + constructor(scope, id) { + this._scope = scope; + this._id = id; + this._onMessage = this._onMessage.bind(this); + } ready() { this._scope.addEventListener("message", this._onMessage); - }, + } close() { this._scope.removeEventListener("message", this._onMessage); this.hooks?.onTransportClosed(); - }, + } send(packet) { this._scope.postMessage( @@ -91,11 +88,11 @@ WorkerThreadWorkerDebuggerTransport.prototype = { message: packet, }) ); - }, + } startBulkSend() { throw new Error("Can't send bulk data from worker threads!"); - }, + } _onMessage(event) { const packet = JSON.parse(event.data); @@ -106,8 +103,8 @@ WorkerThreadWorkerDebuggerTransport.prototype = { if (this.hooks) { this.hooks.onPacket(packet.message); } - }, -}; + } +} exports.WorkerThreadWorkerDebuggerTransport = WorkerThreadWorkerDebuggerTransport; diff --git a/dom/base/crashtests/1991206.html b/dom/base/crashtests/1991206.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<script> +window.addEventListener("load", async () => { + const sup = document.getElementById("id_1") + const range = new Range() + const selection = window.getSelection() + const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT, { + "acceptNode": async function(n) { + range.selectNodeContents(n) + } + }) + + iterator.nextNode() + range.setStartBefore(sup) + selection.addRange(range) +}) +</script> +<sup id="id_1"></sup> +</html> +<!-- COMMENT --> + +\ No newline at end of file diff --git a/dom/base/crashtests/crashtests.list b/dom/base/crashtests/crashtests.list @@ -283,3 +283,4 @@ load 1966485.html load 1966466.html load 1969289.html load 1975990.html +load 1991206.html diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp @@ -796,10 +796,8 @@ static auto* GetFlattenedTreeParent(const nsIContent* aContent) { return aContent->GetFlattenedTreeParent(); } -static nsIContent* GetFlattenedTreeParentNodeForSelection( - const nsIContent* aNode) { - nsINode* parent = aNode->GetFlattenedTreeParentNodeForSelection(); - return parent && parent->IsContent() ? parent->AsContent() : nullptr; +static nsINode* GetFlattenedTreeParentNodeForSelection(const nsINode* aNode) { + return aNode->GetFlattenedTreeParentNodeForSelection(); } static auto* GetFlattenedTreeParentElementForStyle(const Element* aElement) { @@ -3322,14 +3320,14 @@ nsIContent* nsContentUtils::GetCommonFlattenedTreeAncestorHelper( } /* static */ -nsIContent* nsContentUtils::GetCommonFlattenedTreeAncestorForSelection( - nsIContent* aContent1, nsIContent* aContent2) { - if (aContent1 == aContent2) { - return aContent1; +nsINode* nsContentUtils::GetCommonFlattenedTreeAncestorForSelection( + nsINode* aNode1, nsINode* aNode2) { + if (aNode1 == aNode2) { + return aNode1; } - MOZ_ASSERT(aContent1); - MOZ_ASSERT(aContent2); - return CommonAncestors(*aContent1, *aContent2, + MOZ_ASSERT(aNode1); + MOZ_ASSERT(aNode2); + return CommonAncestors(*aNode1, *aNode2, GetFlattenedTreeParentNodeForSelection) .GetClosestCommonAncestor(); } diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h @@ -549,8 +549,8 @@ class nsContentUtils { * Returns the common flattened tree ancestor from the point of view of * the selection system, if any, for two given content nodes. */ - static nsIContent* GetCommonFlattenedTreeAncestorForSelection( - nsIContent* aContent1, nsIContent* aContent2); + static nsINode* GetCommonFlattenedTreeAncestorForSelection(nsINode* aNode1, + nsINode* aNode2); /** * Returns the common flattened tree ancestor from the point of view of the diff --git a/dom/ipc/ContentChild.cpp b/dom/ipc/ContentChild.cpp @@ -1961,9 +1961,15 @@ mozilla::ipc::IPCResult ContentChild::RecvConstructBrowser( RefPtr<nsOpenWindowInfo> openWindowInfo = new nsOpenWindowInfo(); openWindowInfo->mPrincipalToInheritForAboutBlank = aWindowInit.principal(); - if (NS_WARN_IF(NS_FAILED(browserChild->Init(/* aOpener */ nullptr, - windowChild, openWindowInfo)))) { - return IPC_FAIL(browserChild, "BrowserChild::Init failed"); + { + // Block the script runner that notifies about the creation of the script + // global for the initial about:blank. + nsAutoScriptBlocker blockScripts; + + if (NS_WARN_IF(NS_FAILED(browserChild->Init( + /* aOpener */ nullptr, windowChild, openWindowInfo)))) { + return IPC_FAIL(browserChild, "BrowserChild::Init failed"); + } } nsCOMPtr<nsIObserverService> os = services::GetObserverService(); diff --git a/dom/script/ScriptElement.cpp b/dom/script/ScriptElement.cpp @@ -15,6 +15,7 @@ #include "mozilla/dom/Element.h" #include "mozilla/dom/TrustedTypeUtils.h" #include "mozilla/dom/TrustedTypesConstants.h" +#include "mozilla/extensions/WebExtensionPolicy.h" #include "nsContentSink.h" #include "nsContentUtils.h" #include "nsGkAtoms.h" @@ -159,18 +160,19 @@ bool ScriptElement::MaybeProcessScript() { // use a void string. // - If it is an external script, we similarly just pass a void string. if (!HasExternalScriptContent() && !mIsTrusted) { - // TODO: We should likely block parser if IsClassicNonAsyncDefer() returns - // true but this is tricky because the default policy callback can actually - // change the script type. - nsContentUtils::AddScriptRunner(NS_NewRunnableFunction( - "ScriptElement::MaybeProcessScript", - [self = RefPtr<nsIScriptElement>(this)]() - MOZ_CAN_RUN_SCRIPT_BOUNDARY_LAMBDA { - nsString sourceText; - self->GetTrustedTypesCompliantInlineScriptText(sourceText); - ((ScriptElement*)self.get())->MaybeProcessScript(sourceText); - })); - return false; + if (!TrustedTypeUtils::CanSkipTrustedTypesEnforcement( + *GetAsContent()->AsElement())) { + // TODO(bug 1997818): Ensure we properly block the parser. + nsContentUtils::AddScriptRunner(NS_NewRunnableFunction( + "ScriptElement::MaybeProcessScript", + [self = RefPtr<nsIScriptElement>(this)]() + MOZ_CAN_RUN_SCRIPT_BOUNDARY_LAMBDA { + nsString sourceText; + self->GetTrustedTypesCompliantInlineScriptText(sourceText); + ((ScriptElement*)self.get())->MaybeProcessScript(sourceText); + })); + return false; + } } return MaybeProcessScript(VoidString()); } @@ -178,9 +180,14 @@ bool ScriptElement::MaybeProcessScript() { bool ScriptElement::MaybeProcessScript(const nsAString& aSourceText) { nsIContent* cont = GetAsContent(); if (!HasExternalScriptContent()) { + // If el has no src attribute, and source text is the empty string, then + // return (https://html.spec.whatwg.org/#prepare-the-script-element). + // + // A void aSourceText means we want to retrieve it lazily (bug 1376651), in + // that case we browse the subtree to try and find a non-empty text node. bool hasInlineScriptContent = - mIsTrusted ? nsContentUtils::HasNonEmptyTextContent(cont) - : !aSourceText.IsEmpty(); + aSourceText.IsVoid() ? nsContentUtils::HasNonEmptyTextContent(cont) + : !aSourceText.IsEmpty(); if (!hasInlineScriptContent) { // In the case of an empty, non-external classic script, there is nothing // to process. However, we must perform a microtask checkpoint afterwards, @@ -191,7 +198,6 @@ bool ScriptElement::MaybeProcessScript(const nsAString& aSourceText) { } return false; } - MOZ_ASSERT(mIsTrusted == aSourceText.IsVoid()); } // Check the type attribute to determine language and version. If type exists, @@ -285,6 +291,19 @@ void ScriptElement::UpdateTrustWorthiness( MutationEffectOnScript aMutationEffectOnScript) { if (aMutationEffectOnScript == MutationEffectOnScript::DropTrustWorthiness && StaticPrefs::dom_security_trusted_types_enabled()) { + nsCOMPtr<nsIPrincipal> subjectPrincipal; + if (JSContext* cx = nsContentUtils::GetCurrentJSContext()) { + subjectPrincipal = nsContentUtils::SubjectPrincipal(cx); + if (auto* principal = BasePrincipal::Cast(subjectPrincipal)) { + if (principal->IsSystemPrincipal() || + principal->ContentScriptAddonPolicyCore()) { + // This script was modified by a priviledged scripts, so continue to + // consider it as trusted. + return; + } + } + } + mIsTrusted = false; } } @@ -303,15 +322,10 @@ nsresult ScriptElement::GetTrustedTypesCompliantInlineScriptText( constexpr nsLiteralString svgSinkName = u"SVGScriptElement text"_ns; ErrorResult error; - nsCOMPtr<nsIPrincipal> subjectPrincipal; - if (JSContext* cx = nsContentUtils::GetCurrentJSContext()) { - subjectPrincipal = nsContentUtils::SubjectPrincipal(cx); - } const nsAString* compliantString = TrustedTypeUtils::GetTrustedTypesCompliantStringForTrustedScript( sourceText, element->IsHTMLElement() ? htmlSinkName : svgSinkName, - kTrustedTypesOnlySinkGroup, *element, subjectPrincipal, - compliantStringHolder, error); + kTrustedTypesOnlySinkGroup, *element, compliantStringHolder, error); if (!error.Failed()) { aSourceText.Assign(*compliantString); } diff --git a/dom/script/ScriptLoadContext.cpp b/dom/script/ScriptLoadContext.cpp @@ -150,6 +150,7 @@ bool ScriptLoadContext::HasScriptElement() const { return !!mScriptElement; } void ScriptLoadContext::GetInlineScriptText(nsAString& aText) const { MOZ_ASSERT(mIsInline); if (mSourceText.IsVoid()) { + // Lazily retrieve the text of inline script, see bug 1376651. mScriptElement->GetScriptText(aText); } else { aText.Append(mSourceText); diff --git a/dom/security/trusted-types/TrustedTypeUtils.cpp b/dom/security/trusted-types/TrustedTypeUtils.cpp @@ -407,29 +407,23 @@ static inline const nsAString* GetContent( return IsString(aInput) ? GetAsString(aInput) : GetAsTrustedType(aInput); } -template <typename ExpectedType, typename TrustedTypeOrString, - typename NodeOrGlobalObject> -MOZ_CAN_RUN_SCRIPT inline const nsAString* GetTrustedTypesCompliantString( - const TrustedTypeOrString& aInput, const nsAString& aSink, - const nsAString& aSinkGroup, NodeOrGlobalObject& aNodeOrGlobalObject, - nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder, +template <typename NodeOrGlobalObject> +inline bool PrepareExecutionOfTrustedTypesDefaultPolicy( + NodeOrGlobalObject& aNodeOrGlobalObject, nsIPrincipal* aPrincipalOrNull, + nsIGlobalObject*& aGlobalObject, nsPIDOMWindowInner*& aPIDOMWindowInner, + RequireTrustedTypesForDirectiveState* aRequireTrustedTypesForDirectiveState, ErrorResult& aError) { - MOZ_ASSERT(aSinkGroup == kTrustedTypesOnlySinkGroup); if (!StaticPrefs::dom_security_trusted_types_enabled()) { // A trusted type might've been created before the pref was set to `false`, // so we cannot assume aInput.IsString(). - return GetContent(aInput); - } - - if (IsTrustedType(aInput)) { - return GetAsTrustedType(aInput); + return false; } // Exempt web extension content scripts from trusted types policies defined by // the page in which they are running. if (auto* principal = BasePrincipal::Cast(aPrincipalOrNull)) { if (principal->ContentScriptAddonPolicyCore()) { - return GetAsString(aInput); + return false; } } @@ -444,30 +438,30 @@ MOZ_CAN_RUN_SCRIPT inline const nsAString* GetTrustedTypesCompliantString( nsPIDOMWindowInner* piDOMWindowInner = nullptr; if constexpr (std::is_same_v<NodeOrGlobalObjectArg, nsINode>) { if (aNodeOrGlobalObject.HasBeenInUAWidget()) { - return GetAsString(aInput); + return false; } Document* ownerDoc = aNodeOrGlobalObject.OwnerDoc(); const bool ownerDocLoadedAsData = ownerDoc->IsLoadedAsData(); if (!ownerDoc->HasPolicyWithRequireTrustedTypesForDirective() && !ownerDocLoadedAsData) { - return GetAsString(aInput); + return false; } globalObject = ownerDoc->GetScopeObject(); if (!globalObject) { aError.ThrowTypeError("No global object"); - return nullptr; + return false; } piDOMWindowInner = globalObject->GetAsInnerWindow(); if (!piDOMWindowInner) { // Global object is not a Window. This can happen when DOM APIs are used // in some contexts where Trusted Types don't apply (e.g. bug 1942517), // so just return the input string. - return GetAsString(aInput); + return false; } if (ownerDocLoadedAsData && piDOMWindowInner->GetExtantDoc() && !piDOMWindowInner->GetExtantDoc() ->HasPolicyWithRequireTrustedTypesForDirective()) { - return GetAsString(aInput); + return false; } } else if constexpr (std::is_same_v<NodeOrGlobalObjectArg, nsIGlobalObject>) { piDOMWindowInner = aNodeOrGlobalObject.GetAsInnerWindow(); @@ -475,7 +469,7 @@ MOZ_CAN_RUN_SCRIPT inline const nsAString* GetTrustedTypesCompliantString( const Document* extantDoc = piDOMWindowInner->GetExtantDoc(); if (extantDoc && !extantDoc->HasPolicyWithRequireTrustedTypesForDirective()) { - return GetAsString(aInput); + return false; } } globalObject = &aNodeOrGlobalObject; @@ -489,13 +483,13 @@ MOZ_CAN_RUN_SCRIPT inline const nsAString* GetTrustedTypesCompliantString( // (https://w3c.github.io/trusted-types/dist/spec/#abstract-opdef-does-sink-type-require-trusted-types) // and "Should sink type mismatch violation be blocked by CSP?" // (https://w3c.github.io/trusted-types/dist/spec/#should-block-sink-type-mismatch). - RefPtr<nsIContentSecurityPolicy> csp; RequireTrustedTypesForDirectiveState requireTrustedTypesForDirectiveState = RequireTrustedTypesForDirectiveState::NONE; if (piDOMWindowInner) { - csp = PolicyContainer::GetCSP(piDOMWindowInner->GetPolicyContainer()); + RefPtr<nsIContentSecurityPolicy> csp = + PolicyContainer::GetCSP(piDOMWindowInner->GetPolicyContainer()); if (!csp) { - return GetAsString(aInput); + return false; } requireTrustedTypesForDirectiveState = csp->GetRequireTrustedTypesForDirectiveState(); @@ -511,13 +505,53 @@ MOZ_CAN_RUN_SCRIPT inline const nsAString* GetTrustedTypesCompliantString( cspInfo.requireTrustedTypesForDirectiveState(); if (requireTrustedTypesForDirectiveState == RequireTrustedTypesForDirectiveState::NONE) { - return GetAsString(aInput); + return false; } } else { // Global object is neither Window nor WorkerGlobalScope. This can happen // when DOM APIs are used in some contexts where Trusted Types don't apply // (e.g. bugs 1942517 and 1936219), so just return the input string. - return GetAsString(aInput); + return false; + } + + aGlobalObject = globalObject; + aPIDOMWindowInner = piDOMWindowInner; + *aRequireTrustedTypesForDirectiveState = requireTrustedTypesForDirectiveState; + return true; +} + +bool CanSkipTrustedTypesEnforcement(const nsINode& aNode) { + nsIGlobalObject* dummyGlobal = nullptr; + nsPIDOMWindowInner* dummyWindow = nullptr; + RequireTrustedTypesForDirectiveState dummyState; + // Specify a null principal, as ScriptElement::UpdateTrustWorthiness() has + // already checked whether this is running in an isolated web extension + // context. + return !PrepareExecutionOfTrustedTypesDefaultPolicy( + aNode, nullptr /* aPrincipalOrNull */, dummyGlobal, dummyWindow, + &dummyState, IgnoreErrors()); +} + +template <typename ExpectedType, typename TrustedTypeOrString, + typename NodeOrGlobalObject> +MOZ_CAN_RUN_SCRIPT inline const nsAString* GetTrustedTypesCompliantString( + const TrustedTypeOrString& aInput, const nsAString& aSink, + const nsAString& aSinkGroup, NodeOrGlobalObject& aNodeOrGlobalObject, + nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder, + ErrorResult& aError) { + MOZ_ASSERT(aSinkGroup == kTrustedTypesOnlySinkGroup); + + if (IsTrustedType(aInput)) { + return GetAsTrustedType(aInput); + } + + nsIGlobalObject* globalObject = nullptr; + nsPIDOMWindowInner* piDOMWindowInner = nullptr; + RequireTrustedTypesForDirectiveState requireTrustedTypesForDirectiveState; + if (!PrepareExecutionOfTrustedTypesDefaultPolicy( + aNodeOrGlobalObject, aPrincipalOrNull, globalObject, piDOMWindowInner, + &requireTrustedTypesForDirectiveState, aError)) { + return aError.Failed() ? nullptr : GetAsString(aInput); } RefPtr<ExpectedType> convertedInput; @@ -533,6 +567,8 @@ MOZ_CAN_RUN_SCRIPT inline const nsAString* GetTrustedTypesCompliantString( if (!convertedInput) { auto location = JSCallingLocation::Get(); if (piDOMWindowInner) { + RefPtr<nsIContentSecurityPolicy> csp = + PolicyContainer::GetCSP(piDOMWindowInner->GetPolicyContainer()); ReportSinkTypeMismatchViolations(csp, nullptr /* aCSPEventListener */, location.FileName(), location.mLine, location.mColumn, aSink, aSinkGroup, @@ -625,11 +661,13 @@ MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantStringForTrustedScript( const nsAString& aInput, const nsAString& aSink, const nsAString& aSinkGroup, const nsINode& aNode, - nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder, - ErrorResult& aError) { + Maybe<nsAutoString>& aResultHolder, ErrorResult& aError) { + // Specify a null principal, as ScriptElement::UpdateTrustWorthiness() has + // already checked whether this is running in an isolated web extension + // context. return GetTrustedTypesCompliantString<TrustedScript>( - &aInput, aSink, aSinkGroup, aNode, aPrincipalOrNull, aResultHolder, - aError); + &aInput, aSink, aSinkGroup, aNode, nullptr /* aPrincipalOrNull */, + aResultHolder, aError); } bool GetTrustedTypeDataForAttribute(const nsAtom* aElementName, diff --git a/dom/security/trusted-types/TrustedTypeUtils.h b/dom/security/trusted-types/TrustedTypeUtils.h @@ -69,6 +69,8 @@ void ReportSinkTypeMismatchViolations(nsIContentSecurityPolicy* aCSP, const nsAString& aSinkGroup, const nsAString& aSource); +bool CanSkipTrustedTypesEnforcement(const nsINode& aNode); + // https://w3c.github.io/trusted-types/dist/spec/#get-trusted-type-compliant-string-algorithm // // May only run script if aInput is not a trusted type and if the trusted types @@ -145,8 +147,7 @@ MOZ_CAN_RUN_SCRIPT const nsAString* GetTrustedTypesCompliantStringForTrustedScript( const nsAString& aInput, const nsAString& aSink, const nsAString& aSinkGroup, const nsINode& aNode, - nsIPrincipal* aPrincipalOrNull, Maybe<nsAutoString>& aResultHolder, - ErrorResult& aError); + Maybe<nsAutoString>& aResultHolder, ErrorResult& aError); // https://w3c.github.io/trusted-types/dist/spec/#abstract-opdef-process-value-with-a-default-policy template <typename ExpectedType> diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp @@ -4774,6 +4774,7 @@ bool WorkerPrivate::FreezeInternal() { data->mScope ? data->mScope->GetTimeoutManager() : nullptr; if (timeoutManager) { timeoutManager->Suspend(); + timeoutManager->Freeze(); } return true; @@ -4794,23 +4795,24 @@ bool WorkerPrivate::ThawInternal() { // BindRemoteWorkerDebuggerChild(); + data->mFrozen = false; + + auto* timeoutManager = + data->mScope ? data->mScope->GetTimeoutManager() : nullptr; + if (timeoutManager) { + timeoutManager->Thaw(); + timeoutManager->Resume(); + } + for (uint32_t index = 0; index < data->mChildWorkers.Length(); index++) { data->mChildWorkers[index]->Thaw(nullptr); } - data->mFrozen = false; - // The worker can thaw even if it failed to run (and doesn't have a global). if (data->mScope) { data->mScope->MutableClientSourceRef().Thaw(); } - auto* timeoutManager = - data->mScope ? data->mScope->GetTimeoutManager() : nullptr; - if (timeoutManager) { - timeoutManager->Resume(); - } - return true; } diff --git a/editor/libeditor/HTMLEditor.cpp b/editor/libeditor/HTMLEditor.cpp @@ -7134,9 +7134,9 @@ Element* HTMLEditor::ComputeEditingHostInternal( if (!selectionCommonAncestor) { selectionCommonAncestor = commonAncestor; } else { - selectionCommonAncestor = + selectionCommonAncestor = nsIContent::FromNodeOrNull( nsContentUtils::GetCommonFlattenedTreeAncestorForSelection( - commonAncestor, selectionCommonAncestor); + commonAncestor, selectionCommonAncestor)); } } if (selectionCommonAncestor) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml @@ -20,7 +20,7 @@ biometric = "1.1.0" browser = "1.9.0" cardview = "1.0.0" collection = "1.5.0" -compose-bom = "2025.12.00" +compose-bom = "2025.11.01" concurrent = "1.3.0" constraintlayout = "2.2.1" constraintlayout-compose = "1.1.1" @@ -91,17 +91,17 @@ junit4 = "4.13.2" junit6 = "6.0.1" leakcanary = "2.14" mockito = "5.20.0" -mockk = "1.14.6" +mockk = "1.14.7" robolectric = "4.16" # Third party libraries -adjust = "5.4.6" +adjust = "5.5.0" androidsvg = "1.4" disklrucache = "2.0.2" jna = "5.18.1" okhttp = "4.12.0" okio = "3.15.0" -sentry = "8.27.1" +sentry = "8.28.0" zxing = "3.5.4" [libraries] diff --git a/layout/base/DisplayPortUtils.cpp b/layout/base/DisplayPortUtils.cpp @@ -850,55 +850,6 @@ bool DisplayPortUtils::MaybeCreateDisplayPort( return false; } -nsIFrame* DisplayPortUtils::OneStepInAsyncScrollableAncestorChain( - nsIFrame* aFrame) { - // This mirrors one iteration of GetNearestScrollableOrOverflowClipFrame in - // nsLayoutUtils.cpp as called by - // nsLayoutUtils::GetAsyncScrollableAncestorFrame. They should be kept in - // sync. See that function for comments about the structure of this code. - if (aFrame->IsMenuPopupFrame()) { - return nullptr; - } - nsIFrame* anchor = nullptr; - while ((anchor = - AnchorPositioningUtils::GetAnchorThatFrameScrollsWith(aFrame))) { - aFrame = anchor; - } - if (aFrame->StyleDisplay()->mPosition == StylePositionProperty::Fixed && - nsLayoutUtils::IsReallyFixedPos(aFrame)) { - if (nsIFrame* root = aFrame->PresShell()->GetRootScrollContainerFrame()) { - return root; - } - } - return nsLayoutUtils::GetCrossDocParentFrameInProcess(aFrame); -} - -nsIFrame* DisplayPortUtils::OneStepInASRChain( - nsIFrame* aFrame, nsIFrame* aLimitAncestor /* = nullptr */) { - // This mirrors one iteration of GetNearestScrollableOrOverflowClipFrame in - // nsLayoutUtils.cpp as called by nsLayoutUtils::GetASRAncestorFrame. They - // should be kept in sync. See that function for comments about the structure - // of this code. - if (aFrame->IsMenuPopupFrame()) { - return nullptr; - } - nsIFrame* anchor = nullptr; - while ((anchor = - AnchorPositioningUtils::GetAnchorThatFrameScrollsWith(aFrame))) { - MOZ_ASSERT_IF(aLimitAncestor, - nsLayoutUtils::IsProperAncestorFrameConsideringContinuations( - aLimitAncestor, anchor)); - aFrame = anchor; - } - nsIFrame* parent = nsLayoutUtils::GetCrossDocParentFrameInProcess(aFrame); - if (aLimitAncestor && parent && - (parent == aLimitAncestor || - parent->FirstContinuation() == aLimitAncestor->FirstContinuation())) { - return nullptr; - } - return parent; -} - void DisplayPortUtils::SetZeroMarginDisplayPortOnAsyncScrollableAncestors( nsIFrame* aFrame) { nsIFrame* frame = aFrame; @@ -1063,6 +1014,116 @@ bool DisplayPortUtils::WillUseEmptyDisplayPortMargins(nsIContent* aContent) { nsLayoutUtils::ShouldDisableApzForElement(aContent); } +nsIFrame* DisplayPortUtils::OneStepInAsyncScrollableAncestorChain( + nsIFrame* aFrame) { + // This mirrors one iteration of GetNearestScrollableOrOverflowClipFrame in + // nsLayoutUtils.cpp as called by + // nsLayoutUtils::GetAsyncScrollableAncestorFrame. They should be kept in + // sync. See that function for comments about the structure of this code. + if (aFrame->IsMenuPopupFrame()) { + return nullptr; + } + nsIFrame* anchor = nullptr; + while ((anchor = + AnchorPositioningUtils::GetAnchorThatFrameScrollsWith(aFrame))) { + aFrame = anchor; + } + if (aFrame->StyleDisplay()->mPosition == StylePositionProperty::Fixed && + nsLayoutUtils::IsReallyFixedPos(aFrame)) { + if (nsIFrame* root = aFrame->PresShell()->GetRootScrollContainerFrame()) { + return root; + } + } + return nsLayoutUtils::GetCrossDocParentFrameInProcess(aFrame); +} + +nsIFrame* DisplayPortUtils::GetASRAncestorFrame( + nsIFrame* aFrame, nsDisplayListBuilder* aBuilder) { + MOZ_ASSERT(aBuilder->IsPaintingToWindow()); + // This has different behaviour from + // nsLayoutUtils::GetAsyncScrollableAncestorFrame because the ASR tree is + // different from the "async scrollable ancestor chain" which is mainly used + // for activating display ports. We don't want the + // SCROLLABLE_ALWAYS_MATCH_ROOT behaviour because we only want to match the + // root if it generates an ASR. We don't want the + // SCROLLABLE_FIXEDPOS_FINDS_ROOT behaviour because the ASR tree does not jump + // from fixed pos to root (that behaviour exists so that fixed pos in the root + // document in the process can find some apzc, ASRs have no such need and that + // would be incorrect). This should be kept in sync with + // OneStepInAsyncScrollableAncestorChain, OneStepInASRChain, + // nsLayoutUtils::GetAsyncScrollableAncestorFrame. + + for (nsIFrame* f = aFrame; f; + f = nsLayoutUtils::GetCrossDocParentFrameInProcess(f)) { + if (f->IsMenuPopupFrame()) { + break; + } + + // Note that the order of checking for a scroll container frame with + // IsMaybeAsynchronouslyScrolled, anchors, and sticky pos is significant. + // The potential ASR of the scroll container frame is the "inner" one, the + // potenial ASR of the sticky is the "outer" one. + if (ScrollContainerFrame* scrollContainerFrame = do_QueryFrame(f)) { + if (scrollContainerFrame->IsMaybeAsynchronouslyScrolled()) { + return f; + } + } + + nsIFrame* anchor = nullptr; + // This needs to be a while loop because anchors can chain, and we don't + // want to consider each frame in this loop separately (as a potential + // scrollable ancestor) because they are all equivalent in the scrollable + // ancestor chain: they all scroll together. We are not walking up the async + // scrollable ancestor chain, but rather we are moving sideways. And when + // we exit this loop the last frame might be a sticky asr, after that we + // move up (the next iteration of the outer for loop). + while ( + (anchor = AnchorPositioningUtils::GetAnchorThatFrameScrollsWith(f))) { + f = anchor; + } + + // The ordering of this sticky check and the above anchor loop is + // significant, even though a frame can't be both sticky pos and anchored + // (because anchoring requires abs pos): if we follow an anchor, the anchor + // could be an active sticky pos, so that would generate an ASR and we want + // to return that rather than do another iteration of the outer for loop + // which moves on to the (crossdoc) parent frame. + if (f->StyleDisplay()->mPosition == StylePositionProperty::Sticky) { + auto* ssc = StickyScrollContainer::GetOrCreateForFrame(f); + if (ssc && ssc->ScrollContainer()->IsMaybeAsynchronouslyScrolled()) { + return f->FirstContinuation(); + } + } + } + return nullptr; +} + +nsIFrame* DisplayPortUtils::OneStepInASRChain( + nsIFrame* aFrame, nsIFrame* aLimitAncestor /* = nullptr */) { + // This has the same basic structure as GetASRAncestorFrame since they are + // meant to be used together. So this should be kept in sync with + // GetASRAncestorFrame. See that function for more comments about the + // structure of this code. + if (aFrame->IsMenuPopupFrame()) { + return nullptr; + } + nsIFrame* anchor = nullptr; + while ((anchor = + AnchorPositioningUtils::GetAnchorThatFrameScrollsWith(aFrame))) { + MOZ_ASSERT_IF(aLimitAncestor, + nsLayoutUtils::IsProperAncestorFrameConsideringContinuations( + aLimitAncestor, anchor)); + aFrame = anchor; + } + nsIFrame* parent = nsLayoutUtils::GetCrossDocParentFrameInProcess(aFrame); + if (aLimitAncestor && parent && + (parent == aLimitAncestor || + parent->FirstContinuation() == aLimitAncestor->FirstContinuation())) { + return nullptr; + } + return parent; +} + // This first checks if aFrame is a scroll frame, if so it then tries to // activate it. Then this function returns true if aFrame generates a scroll ASR // (ie its an active scroll frame). @@ -1105,7 +1166,7 @@ const ActiveScrolledRoot* DisplayPortUtils::ActivateDisplayportOnASRAncestors( aBuilder, aLimitAncestor)); MOZ_ASSERT((aASRofLimitAncestor ? aASRofLimitAncestor->mFrame : nullptr) == - nsLayoutUtils::GetASRAncestorFrame(aLimitAncestor, aBuilder)); + GetASRAncestorFrame(aLimitAncestor, aBuilder)); MOZ_ASSERT(nsLayoutUtils::IsProperAncestorFrameConsideringContinuations( aLimitAncestor, aAnchor)); @@ -1170,9 +1231,9 @@ const ActiveScrolledRoot* DisplayPortUtils::ActivateDisplayportOnASRAncestors( MOZ_ASSERT(asr->mKind == ActiveScrolledRoot::ASRKind::Sticky); MOZ_ASSERT(asrFrame.mASRKind == ActiveScrolledRoot::ASRKind::Scroll); } else { - MOZ_ASSERT((asr ? asr->mFrame : nullptr) == - nsLayoutUtils::GetASRAncestorFrame( - OneStepInASRChain(asrFrame.mFrame), aBuilder)); + MOZ_ASSERT( + (asr ? asr->mFrame : nullptr) == + GetASRAncestorFrame(OneStepInASRChain(asrFrame.mFrame), aBuilder)); } #endif diff --git a/layout/base/DisplayPortUtils.h b/layout/base/DisplayPortUtils.h @@ -286,27 +286,6 @@ class DisplayPortUtils { ScrollContainerFrame* aScrollContainerFrame, RepaintMode aRepaintMode); /** - * Step up one frame in the async scrollable ancestor chain, to be used in - * conjunction with GetAsyncScrollableAncestorFrame to walk the async - * scrollable ancestor chain. Note this doesn't go from one async scrollable - * frame to the next. Rather this walks all frame types, taking only one - * ancestor step per call. - */ - static nsIFrame* OneStepInAsyncScrollableAncestorChain(nsIFrame* aFrame); - - /** - * Step up one frame in the ASR chain, to be used in conjunction with - * GetASRAncestorFrame to walk the ASR chain. Note this doesn't go from one - * ASR frame to the next. Rather this walks all frame types, taking only one - * ancestor step per call. Note that a frame returned from this function could - * generate two ASRs: an inner one corresponding to an activated scroll frame, - * and an outer one corresponding to sticky pos. Returns null if we hit - * aLimitAncestor. - */ - static nsIFrame* OneStepInASRChain(nsIFrame* aFrame, - nsIFrame* aLimitAncestor = nullptr); - - /** * Sets a zero margin display port on all proper ancestors of aFrame that * are async scrollable. */ @@ -340,6 +319,51 @@ class DisplayPortUtils { static bool WillUseEmptyDisplayPortMargins(nsIContent* aContent); /** + * Step up one frame in the async scrollable ancestor chain, to be used in + * conjunction with GetAsyncScrollableAncestorFrame to walk the async + * scrollable ancestor chain. Note this doesn't go from one async scrollable + * frame to the next. Rather this walks all frame types, taking only one + * ancestor step per call. + */ + static nsIFrame* OneStepInAsyncScrollableAncestorChain(nsIFrame* aFrame); + + /** + * Follows the ASR (ActiveScrolledRoot) chain of frames, so that if + * f is the frame of an ASR A, then calling this function on + * OneStepInASRChain(f) will return the frame of parent ASR of A. Frames that + * generate an ASR are scroll frames for which IsMaybeAsynchronouslyScrolled() + * returns true (aka mWillBuildScrollableLayer == true) or they are sticky + * position frames for which their corresponding scroll frame will generate an + * ASR. This function is different from + * nsLayoutUtils::GetAsyncScrollableAncestorFrame because + * GetAsyncScrollableAncestorFrame looks only for scroll frames that + * WantAsyncScroll that that function walks from fixed pos to the root scroll + * frame. Because that status (ie mWillBuildScrollableLayer) can change this + * should only be called during a paint to the window after BuildDisplayList + * has been called on aTarget so that mWillBuildScrollableLayer will have been + * updated for this paint already for any frame we need to consult. Or for + * some other reason you know that mWillBuildScrollableLayer is up to date for + * this paint for any frame that might need to be consulted, ie you just + * updated them yourself. Note that a frame returned from this function could + * generate two ASRs: an inner one corresponding to an activated scroll frame, + * and an outer one corresponding to sticky pos. + */ + static nsIFrame* GetASRAncestorFrame(nsIFrame* aFrame, + nsDisplayListBuilder* aBuilder); + + /** + * Step up one frame in the ASR chain, to be used in conjunction with + * GetASRAncestorFrame to walk the ASR chain. Note this doesn't go from one + * ASR frame to the next. Rather this walks all frame types, taking only one + * ancestor step per call. Note that a frame returned from this function could + * generate two ASRs: an inner one corresponding to an activated scroll frame, + * and an outer one corresponding to sticky pos. Returns null if we hit + * aLimitAncestor. + */ + static nsIFrame* OneStepInASRChain(nsIFrame* aFrame, + nsIFrame* aLimitAncestor = nullptr); + + /** * Calls DecideScrollableLayerEnsureDisplayport on all proper ancestors of * aAnchor that are async scrollable up to but not including aLimitAncestor * (this creates a minimal display port on all async scrollable ancestors if diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp @@ -1318,11 +1318,6 @@ static nsIFrame* GetNearestScrollableOrOverflowClipFrame( MOZ_ASSERT( aFrame, "GetNearestScrollableOrOverflowClipFrame expects a non-null frame"); - // Only one of these two flags can be set at a time. - MOZ_ASSERT_IF(aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASYNC_SCROLLABLE, - !(aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASRS)); - MOZ_ASSERT_IF(aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASRS, - !(aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASYNC_SCROLLABLE)); auto GetNextFrame = [aFlags](const nsIFrame* aFrame) -> nsIFrame* { return (aFlags & nsLayoutUtils::SCROLLABLE_SAME_DOC) @@ -1331,8 +1326,9 @@ static nsIFrame* GetNearestScrollableOrOverflowClipFrame( }; // This should be kept in sync with - // DisplayPortUtils::OneStepInAsyncScrollableAncestorChain and - // DisplayPortUtils::OneStepInASRChain. + // DisplayPortUtils::OneStepInAsyncScrollableAncestorChain, + // DisplayPortUtils::OneStepInASRChain, and + // DisplayPortUtils::GetASRAncestorFrame. for (nsIFrame* f = aFrame; f; f = GetNextFrame(f)) { if (aClipFrameCheck && aClipFrameCheck(f)) { return f; @@ -1344,8 +1340,7 @@ static nsIFrame* GetNearestScrollableOrOverflowClipFrame( // TODO: We should also stop at popup frames other than // SCROLLABLE_ONLY_ASYNC_SCROLLABLE cases. - if ((aFlags & (nsLayoutUtils::SCROLLABLE_ONLY_ASYNC_SCROLLABLE | - nsLayoutUtils::SCROLLABLE_ONLY_ASRS)) && + if ((aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASYNC_SCROLLABLE) && f->IsMenuPopupFrame()) { break; } @@ -1355,10 +1350,6 @@ static nsIFrame* GetNearestScrollableOrOverflowClipFrame( if (scrollContainerFrame->WantAsyncScroll()) { return f; } - } else if (aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASRS) { - if (scrollContainerFrame->IsMaybeAsynchronouslyScrolled()) { - return f; - } } else { ScrollStyles ss = scrollContainerFrame->GetScrollStyles(); if ((aFlags & nsLayoutUtils::SCROLLABLE_INCLUDE_HIDDEN) || @@ -1387,34 +1378,18 @@ static nsIFrame* GetNearestScrollableOrOverflowClipFrame( // want to consider each frame in this loop separately (as a potential // scrollable ancestor) because they are all equivalent in the scrollable // ancestor chain: they all scroll together. We are not walking up the async - // scrollable ancestor chain, but rather we are move sideways. And when we - // exit this loop we want to move up one because we haven't yet ascended + // scrollable ancestor chain, but rather we are moving sideways. And when + // we exit this loop we want to move up one because we haven't yet ascended // (because of that same reason), and that moving up one will happen either // via the special fixed pos behaviour below or the next iteration of the // outer for loop. - if (aFlags & (nsLayoutUtils::SCROLLABLE_ONLY_ASYNC_SCROLLABLE | - nsLayoutUtils::SCROLLABLE_ONLY_ASRS)) { + if (aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASYNC_SCROLLABLE) { while ( (anchor = AnchorPositioningUtils::GetAnchorThatFrameScrollsWith(f))) { f = anchor; } } - // Note that the order of checking for anchors and sticky pos is significant - // even though a frame can't be both sticky pos and anchored (because - // anchoring requires abs pos). However, if we follow an anchor, the anchor - // could be an active sticky pos, so that would generate an ASR and we want - // to return that rather than do another iteration of the outer for loop - // which moves on to the (crossdoc) parent frame. - if (aFlags & nsLayoutUtils::SCROLLABLE_ONLY_ASRS) { - if (f->StyleDisplay()->mPosition == StylePositionProperty::Sticky) { - auto* ssc = StickyScrollContainer::GetOrCreateForFrame(f); - if (ssc && ssc->ScrollContainer()->IsMaybeAsynchronouslyScrolled()) { - return f->FirstContinuation(); - } - } - } - if ((aFlags & nsLayoutUtils::SCROLLABLE_FIXEDPOS_FINDS_ROOT) && f->StyleDisplay()->mPosition == StylePositionProperty::Fixed && nsLayoutUtils::IsReallyFixedPos(f)) { @@ -1429,10 +1404,6 @@ static nsIFrame* GetNearestScrollableOrOverflowClipFrame( // static ScrollContainerFrame* nsLayoutUtils::GetNearestScrollContainerFrame( nsIFrame* aFrame, uint32_t aFlags) { - // Not suitable to use SCROLLABLE_ONLY_ASRS here because it needs to return - // non-scroll frames. - MOZ_ASSERT(!(aFlags & SCROLLABLE_ONLY_ASRS), - "can't use SCROLLABLE_ONLY_ASRS flag"); nsIFrame* found = GetNearestScrollableOrOverflowClipFrame(aFrame, aFlags); if (!found) { return nullptr; @@ -2666,21 +2637,6 @@ ScrollContainerFrame* nsLayoutUtils::GetAsyncScrollableAncestorFrame( return nsLayoutUtils::GetNearestScrollContainerFrame(aTarget, flags); } -nsIFrame* nsLayoutUtils::GetASRAncestorFrame(nsIFrame* aTarget, - nsDisplayListBuilder* aBuilder) { - MOZ_ASSERT(aBuilder->IsPaintingToWindow()); - // We use different flags from GetAsyncScrollableAncestorFrame above because - // the ASR tree is different from the "async scrollable ancestor chain". We - // don't want SCROLLABLE_ALWAYS_MATCH_ROOT because we only want to match the - // root if it generates an ASR. We don't want SCROLLABLE_FIXEDPOS_FINDS_ROOT - // because the ASR tree does not jump from fixed pos to root (that behaviour - // exists so that fixed pos in the root document in the process can find some - // apzc, ASRs have no such need and that would be incorrect). - // This should be kept in sync with DisplayPortUtils::OneStepInASRChain. - uint32_t flags = nsLayoutUtils::SCROLLABLE_ONLY_ASRS; - return GetNearestScrollableOrOverflowClipFrame(aTarget, flags); -} - void nsLayoutUtils::AddExtraBackgroundItems(nsDisplayListBuilder* aBuilder, nsDisplayList* aList, nsIFrame* aFrame, diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h @@ -603,22 +603,12 @@ class nsLayoutUtils { */ SCROLLABLE_FIXEDPOS_FINDS_ROOT = 0x10, /** - * If the SCROLLABLE_ONLY_ASRS flag is set, then we only want to return - * frames that will generate an ASR. This means that they are either - * scrollable frames for which IsMaybeAsynchronouslyScrolled() returns true - * (aka mWillBuildScrollableLayer == true) or they are sticky position - * frames for which their corresponding scroll frame will generate an ASR. - * This is an internal only flag, you cannot pass it to - * GetNearestScrollContainerFrame since that can only return scroll frames. - */ - SCROLLABLE_ONLY_ASRS = 0x20, - /** * If the SCROLLABLE_STOP_AT_PAGE flag is set, then we stop searching * for scrollable ancestors when seeing a nsPageFrame. This can be used * to avoid finding the viewport scroll frame in Print Preview (which * would be undesirable as a 'position:sticky' container for content). */ - SCROLLABLE_STOP_AT_PAGE = 0x40, + SCROLLABLE_STOP_AT_PAGE = 0x20, }; /** * GetNearestScrollContainerFrame locates the first ancestor of aFrame @@ -2907,28 +2897,6 @@ class nsLayoutUtils { */ static mozilla::ScrollContainerFrame* GetAsyncScrollableAncestorFrame( nsIFrame* aTarget); - /** - * Follows the ASR (ActiveScrolledRoot) chain of frames, so that if - * f is the frame of an ASR A, then calling this function on - * OneStepInASRChain(f) will return the frame of parent ASR of A. Frames that - * generate an ASR are scroll frames for which IsMaybeAsynchronouslyScrolled() - * returns true (aka mWillBuildScrollableLayer == true) or they are sticky - * position frames for which their corresponding scroll frame will generate an - * ASR. This function is different from GetAsyncScrollableAncestorFrame above - * because GetAsyncScrollableAncestorFrame looks only for scroll frames that - * WantAsyncScroll that that function walks from fixed pos to the root scroll - * frame. Because that status (ie mWillBuildScrollableLayer) can change this - * should only be called during a paint to the window after BuildDisplayList - * has been called on aTarget so that mWillBuildScrollableLayer will have been - * updated for this paint already for any frame we need to consult. Or for - * some other reason you know that mWillBuildScrollableLayer is up to date for - * this paint for any frame that might need to be consulted, ie you just - * updated them yourself. Note that a frame returned from this function could - * generate two ASRs: an inner one corresponding to an activated scroll frame, - * and an outer one corresponding to sticky pos. - */ - static nsIFrame* GetASRAncestorFrame(nsIFrame* aTarget, - nsDisplayListBuilder* aBuilder); static void SetBSizeFromFontMetrics( const nsIFrame* aFrame, mozilla::ReflowOutput& aMetrics, diff --git a/layout/generic/AbsoluteContainingBlock.cpp b/layout/generic/AbsoluteContainingBlock.cpp @@ -1209,27 +1209,13 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame( aAnchorPosResolutionCache, firstTryIndex == currentFallbackIndex); auto cb = [&]() { - if (isGrid) { - // TODO(emilio): how does position-area interact with grid? - const auto border = aDelegatingFrame->GetUsedBorder(); - const nsPoint borderShift{border.left, border.top}; - // Shift in by border of the overall grid container. - return ContainingBlockRect{nsGridContainerFrame::GridItemCB(aKidFrame) + - borderShift}; - } - - auto positionArea = aKidFrame->StylePosition()->mPositionArea; - if (currentFallback && currentFallback->IsPositionArea()) { - MOZ_ASSERT(currentFallback->IsPositionArea()); - positionArea = currentFallback->AsPositionArea(); - } - if (aAnchorPosResolutionCache) { const auto defaultAnchorInfo = AnchorPositioningUtils::ResolveAnchorPosRect( aKidFrame, aDelegatingFrame, nullptr, false, aAnchorPosResolutionCache); if (defaultAnchorInfo) { + auto positionArea = aKidFrame->StylePosition()->mPositionArea; if (!positionArea.IsNone()) { // Offset should be up to, but not including the containing block's // scroll offset. @@ -1260,6 +1246,16 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame( } } + if (isGrid) { + // TODO(emilio, bug 2004596): This adjustment is supposed to also + // restrict the position-area rect above... + const auto border = aDelegatingFrame->GetUsedBorder(); + const nsPoint borderShift{border.left, border.top}; + // Shift in by border of the overall grid container. + return ContainingBlockRect{nsGridContainerFrame::GridItemCB(aKidFrame) + + borderShift}; + } + if (ViewportFrame* viewport = do_QueryFrame(aDelegatingFrame)) { if (!IsSnapshotContainingBlock(aKidFrame)) { return ContainingBlockRect{ diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp @@ -9326,17 +9326,16 @@ nscoord nsGridContainerFrame::ReflowChildren(GridReflowInput& aGridRI, *cb = itemCB.GetPhysicalRect(wm, gridCBPhysicalSize); ++i; } - // We pass a dummy rect as CB because each child has its own CB rect. - // The IsGridContainerCB flag tells AbsoluteContainingBlock::Reflow to - // use those instead. - nsRect dummyRect; + const auto border = aGridRI.mReflowInput->ComputedPhysicalBorder(); + const nsPoint borderShift{border.left, border.top}; + const nsRect paddingRect(borderShift, gridCBPhysicalSize); // XXX: To optimize the performance, set the flags only when the CB width // or height actually changes. AbsPosReflowFlags flags{ AbsPosReflowFlag::AllowFragmentation, AbsPosReflowFlag::CBWidthChanged, AbsPosReflowFlag::CBHeightChanged, AbsPosReflowFlag::IsGridContainerCB}; absoluteContainer->Reflow(this, PresContext(), *aGridRI.mReflowInput, - aStatus, dummyRect, flags, + aStatus, paddingRect, flags, &aDesiredSize.mOverflowAreas); } return bSize; diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp @@ -4454,8 +4454,8 @@ void nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, MOZ_ASSERT(asr == nullptr); MOZ_ASSERT(aBuilder->IsInViewTransitionCapture()); } else if ((asr ? asr->mFrame : nullptr) != - nsLayoutUtils::GetASRAncestorFrame(child->GetParent(), - aBuilder)) { + DisplayPortUtils::GetASRAncestorFrame(child->GetParent(), + aBuilder)) { // A weird case for native anonymous content in the custom content // container when the root is captured by a view transition. This // content is built outside of the view transition capture but the diff --git a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/SessionPrioritizationMiddlewareTest.kt b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/SessionPrioritizationMiddlewareTest.kt @@ -4,6 +4,8 @@ package mozilla.components.browser.state.engine.middleware +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.runTest import mozilla.components.browser.state.action.AppLifecycleAction import mozilla.components.browser.state.action.BrowserAction import mozilla.components.browser.state.action.ContentAction @@ -18,23 +20,18 @@ import mozilla.components.concept.engine.EngineSession.SessionPriority.HIGH import mozilla.components.support.test.any import mozilla.components.support.test.middleware.CaptureActionsMiddleware import mozilla.components.support.test.mock -import mozilla.components.support.test.rule.MainCoroutineRule -import mozilla.components.support.test.rule.runTestOnMain import org.junit.Assert.assertEquals -import org.junit.Rule import org.junit.Test import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.never import org.mockito.Mockito.verify class SessionPrioritizationMiddlewareTest { - @get:Rule - val coroutinesTestRule = MainCoroutineRule() - private val dispatcher = coroutinesTestRule.testDispatcher + private val testDispatcher = StandardTestDispatcher() @Test - fun `GIVEN a linked session WHEN UnlinkEngineSessionAction THEN set the DEFAULT priority to the unlinked tab`() { - val middleware = SessionPrioritizationMiddleware() + fun `GIVEN a linked session WHEN UnlinkEngineSessionAction THEN set the DEFAULT priority to the unlinked tab`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(mainScope = this, waitScope = this) val store = BrowserStore( initialState = BrowserState( tabs = listOf( @@ -53,8 +50,8 @@ class SessionPrioritizationMiddlewareTest { } @Test - fun `GIVEN a linked session WHEN CheckForFormDataAction THEN update the selected linked tab priority to DEFAULT if there is no form data and HIGH when there is form data`() = runTestOnMain { - val middleware = SessionPrioritizationMiddleware(updatePriorityAfterMillis = 0, waitScope = coroutinesTestRule.scope) + fun `GIVEN a linked session WHEN CheckForFormDataAction THEN update the selected linked tab priority to DEFAULT if there is no form data and HIGH when there is form data`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(updatePriorityAfterMillis = 0, mainScope = this, waitScope = this) val capture = CaptureActionsMiddleware<BrowserState, BrowserAction>() val store = BrowserStore( initialState = BrowserState( @@ -73,14 +70,14 @@ class SessionPrioritizationMiddlewareTest { store.dispatch(ContentAction.UpdateHasFormDataAction("1", true)) verify(engineSession1).updateSessionPriority(HIGH) - dispatcher.scheduler.advanceUntilIdle() + testDispatcher.scheduler.advanceUntilIdle() capture.assertLastAction(ContentAction.UpdatePriorityToDefaultAfterTimeoutAction::class) {} } @Test - fun `GIVEN a linked session WHEN CheckForFormDataAction with adjustPriority = false THEN do nothing`() = runTestOnMain { - val middleware = SessionPrioritizationMiddleware() + fun `GIVEN a linked session WHEN CheckForFormDataAction with adjustPriority = false THEN do nothing`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(mainScope = this, waitScope = this) val store = BrowserStore( initialState = BrowserState( tabs = listOf( @@ -98,8 +95,8 @@ class SessionPrioritizationMiddlewareTest { } @Test - fun `GIVEN a previous selected tab WHEN LinkEngineSessionAction THEN update the selected linked tab priority to HIGH`() = runTestOnMain { - val middleware = SessionPrioritizationMiddleware() + fun `GIVEN a previous selected tab WHEN LinkEngineSessionAction THEN update the selected linked tab priority to HIGH`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(mainScope = this, waitScope = this) val store = BrowserStore( initialState = BrowserState( tabs = listOf( @@ -111,18 +108,20 @@ class SessionPrioritizationMiddlewareTest { val engineSession1: EngineSession = mock() store.dispatch(TabListAction.SelectTabAction("1")) + testDispatcher.scheduler.advanceUntilIdle() assertEquals("", middleware.previousHighestPriorityTabId) store.dispatch(EngineAction.LinkEngineSessionAction("1", engineSession1)) + testDispatcher.scheduler.advanceUntilIdle() assertEquals("1", middleware.previousHighestPriorityTabId) verify(engineSession1).updateSessionPriority(HIGH) } @Test - fun `GIVEN a previous selected tab with priority DEFAULT WHEN selecting and linking a new tab THEN update the new one to HIGH and the previous tab based on if it contains form data`() = runTestOnMain { - val middleware = SessionPrioritizationMiddleware() + fun `GIVEN a previous selected tab with priority DEFAULT WHEN selecting and linking a new tab THEN update the new one to HIGH and the previous tab based on if it contains form data`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(mainScope = this, waitScope = this) val store = BrowserStore( initialState = BrowserState( tabs = listOf( @@ -140,15 +139,18 @@ class SessionPrioritizationMiddlewareTest { assertEquals("", middleware.previousHighestPriorityTabId) store.dispatch(EngineAction.LinkEngineSessionAction("1", engineSession1)) + testDispatcher.scheduler.advanceUntilIdle() assertEquals("1", middleware.previousHighestPriorityTabId) verify(engineSession1).updateSessionPriority(HIGH) store.dispatch(TabListAction.SelectTabAction("2")) + testDispatcher.scheduler.advanceUntilIdle() assertEquals("1", middleware.previousHighestPriorityTabId) store.dispatch(EngineAction.LinkEngineSessionAction("2", engineSession2)) + testDispatcher.scheduler.advanceUntilIdle() assertEquals("2", middleware.previousHighestPriorityTabId) verify(engineSession1).checkForFormData() @@ -156,8 +158,8 @@ class SessionPrioritizationMiddlewareTest { } @Test - fun `GIVEN no linked tab WHEN SelectTabAction THEN no changes in priority show happened`() { - val middleware = SessionPrioritizationMiddleware() + fun `GIVEN no linked tab WHEN SelectTabAction THEN no changes in priority show happened`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(mainScope = this, waitScope = this) val store = BrowserStore( initialState = BrowserState( tabs = listOf( @@ -174,8 +176,8 @@ class SessionPrioritizationMiddlewareTest { } @Test - fun `GIVEN selected tab WHEN PauseAction THEN checkForFormData should be called with adjustPriority = false`() = runTestOnMain { - val middleware = SessionPrioritizationMiddleware() + fun `GIVEN selected tab WHEN PauseAction THEN checkForFormData should be called with adjustPriority = false`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(mainScope = this, waitScope = this) val store = BrowserStore( initialState = BrowserState( tabs = listOf( @@ -189,15 +191,19 @@ class SessionPrioritizationMiddlewareTest { store.dispatch(TabListAction.SelectTabAction("1")) store.dispatch(EngineAction.LinkEngineSessionAction("1", engineSession1)) + testDispatcher.scheduler.advanceUntilIdle() + verify(engineSession1).updateSessionPriority(HIGH) store.dispatch(AppLifecycleAction.PauseAction) + testDispatcher.scheduler.advanceUntilIdle() + verify(engineSession1).checkForFormData(adjustPriority = false) } @Test - fun `GIVEN a linked session WHEN UnlinkEngineSessionAction THEN reset previousHighestPriorityTabId`() = runTestOnMain { - val middleware = SessionPrioritizationMiddleware() + fun `GIVEN a linked session WHEN UnlinkEngineSessionAction THEN reset previousHighestPriorityTabId`() = runTest(testDispatcher) { + val middleware = SessionPrioritizationMiddleware(mainScope = this, waitScope = this) val store = BrowserStore( initialState = BrowserState( tabs = listOf( @@ -211,6 +217,9 @@ class SessionPrioritizationMiddlewareTest { store.dispatch(TabListAction.SelectTabAction("1")) store.dispatch(EngineAction.LinkEngineSessionAction("1", engineSession1)) + + testDispatcher.scheduler.advanceUntilIdle() + verify(engineSession1).updateSessionPriority(HIGH) assertEquals("1", middleware.previousHighestPriorityTabId) @@ -227,6 +236,8 @@ class SessionPrioritizationMiddlewareTest { // Previously, `updateSessionPriority` will never be called. clearInvocations(engineSession1) store.dispatch(EngineAction.LinkEngineSessionAction("1", engineSession1)) + testDispatcher.scheduler.advanceUntilIdle() + verify(engineSession1).updateSessionPriority(HIGH) assertEquals("1", middleware.previousHighestPriorityTabId) } diff --git a/mobile/android/android-components/components/compose/base/src/main/res/values-kmr/strings.xml b/mobile/android/android-components/components/compose/base/src/main/res/values-kmr/strings.xml @@ -17,4 +17,6 @@ <string name="text_field_cross_trailing_icon_default_content_description">Nivîsê paqij bike</string> <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> <string name="mozac_compose_base_progress_loading">Tê barkirin</string> + <!-- Content description for the dismiss icon of a Snackbar --> + <string name="mozac_compose_base_snackbar_dismiss_content_description">Peyamê paşguh bike</string> </resources> diff --git a/mobile/android/android-components/components/feature/contextmenu/src/main/res/values-hy-rAM/strings.xml b/mobile/android/android-components/components/feature/contextmenu/src/main/res/values-hy-rAM/strings.xml @@ -10,7 +10,7 @@ <!-- Text for context menu item to open the link in a new tab. --> <string name="mozac_feature_contextmenu_open_link_in_new_tab">Բացել հղումը նոր ներդիրում</string> <!-- Text for context menu item to open the link in a private tab. --> - <string name="mozac_feature_contextmenu_open_link_in_private_tab">Բացել հղումը Մասնավոր ներդիրում</string> + <string name="mozac_feature_contextmenu_open_link_in_private_tab">Բացել հղումը գաղտնի ներդիրում</string> <!-- Text for context menu item to open the image in a new tab. --> <string name="mozac_feature_contextmenu_open_image_in_new_tab">Բացել պատկերը նոր ներդիրում</string> <!-- Text for context menu item to save / download the link. --> @@ -50,7 +50,7 @@ <!-- Action shown in a text selection context menu. This will prompt a search using the selected text. --> <string name="mozac_selection_context_menu_search_2">Որոնում</string> <!-- Action shown in a text selection context menu. This will prompt a search in a private tab using the selected text --> - <string name="mozac_selection_context_menu_search_privately_2">Մասնավոր որոնում</string> + <string name="mozac_selection_context_menu_search_privately_2">Գաղտնի որոնում</string> <!-- Action shown in a text selection context menu. This will prompt a share of the selected text. --> <string name="mozac_selection_context_menu_share">Տարածել</string> <!-- Action shown in a text selection context menu. This will prompt a new email from the selected text. --> diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorScreen.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorScreen.kt @@ -29,12 +29,14 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.autofill.ContentDataType import androidx.compose.ui.autofill.ContentType import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDataType import androidx.compose.ui.semantics.contentType import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId @@ -237,7 +239,7 @@ private fun EditorContent( modifier = Modifier .fillMaxWidth() .testTag(CreditCardEditorTestTags.CARD_NUMBER_FIELD) - .semantics { contentType = ContentType.CreditCardNumber } + .semantics { contentDataType = ContentDataType.None } .focusRequester(focusRequester), errorText = stringResource(R.string.credit_cards_number_validation_error_message_2), label = stringResource(R.string.credit_cards_card_number), @@ -254,7 +256,7 @@ private fun EditorContent( modifier = Modifier .fillMaxWidth() .testTag(CreditCardEditorTestTags.NAME_ON_CARD_FIELD) - .semantics { contentType = ContentType.PersonFullName }, + .semantics { contentDataType = ContentDataType.None }, errorText = stringResource(R.string.credit_cards_name_on_card_validation_error_message_2), label = stringResource(R.string.credit_cards_name_on_card), isError = state.showNameOnCardError, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/AddLoginScreen.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/AddLoginScreen.kt @@ -28,12 +28,16 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTag +import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import mozilla.components.compose.base.annotation.FlexibleWindowLightDarkPreview import mozilla.components.compose.base.button.IconButton +import mozilla.components.compose.base.text.Text import mozilla.components.compose.base.textfield.TextField import mozilla.components.lib.state.ext.observeAsState import mozilla.components.support.ktx.util.URLStringUtils.isHttpOrHttps @@ -49,6 +53,9 @@ internal fun AddLoginScreen(store: LoginsStore) { topBar = { AddLoginTopBar(store) }, + modifier = Modifier.semantics { + testTagsAsResourceId = true + }, ) { paddingValues -> Column( modifier = Modifier @@ -140,11 +147,16 @@ private fun AddLoginHost(store: LoginsStore) { horizontal = FirefoxTheme.layout.space.static200, vertical = FirefoxTheme.layout.space.static100, ) - .width(FirefoxTheme.layout.size.containerMaxWidth), + .width(FirefoxTheme.layout.size.containerMaxWidth) + .semantics { + testTag = LoginsTestingTags.ADD_LOGIN_HOST_NAME_TEXT_FIELD + }, label = stringResource(R.string.preferences_passwords_saved_logins_site), trailingIcon = { if (isFocused && isValidHost(host)) { - CrossTextFieldButton { store.dispatch(AddLoginAction.HostChanged("")) } + CrossTextFieldButton( + contentDescription = Text.Resource(R.string.saved_login_clear_hostname), + ) { store.dispatch(AddLoginAction.HostChanged("")) } } }, ) @@ -182,11 +194,18 @@ private fun AddLoginUsername(store: LoginsStore) { horizontal = FirefoxTheme.layout.space.static200, vertical = FirefoxTheme.layout.space.static100, ) - .width(FirefoxTheme.layout.size.containerMaxWidth), + .width(FirefoxTheme.layout.size.containerMaxWidth) + .semantics { + testTag = LoginsTestingTags.ADD_LOGIN_USER_NAME_TEXT_FIELD + }, label = stringResource(R.string.preferences_passwords_saved_logins_username), trailingIcon = { if (isFocused && addLoginState?.username?.isNotEmpty() == true) { - CrossTextFieldButton { store.dispatch(AddLoginAction.UsernameChanged("")) } + CrossTextFieldButton(contentDescription = Text.Resource(R.string.saved_login_clear_username)) { + store.dispatch( + AddLoginAction.UsernameChanged(""), + ) + } } }, ) @@ -212,11 +231,18 @@ private fun AddLoginPassword(store: LoginsStore) { horizontal = FirefoxTheme.layout.space.static200, vertical = FirefoxTheme.layout.space.static100, ) - .width(FirefoxTheme.layout.size.containerMaxWidth), - label = stringResource(R.string.preferences_passwords_saved_logins_password), + .width(FirefoxTheme.layout.size.containerMaxWidth) + .semantics { + testTag = LoginsTestingTags.ADD_LOGIN_PASSWORD_TEXT_FIELD + }, + label = stringResource(R.string.saved_logins_clear_password), trailingIcon = { if (isFocused && state?.password?.isNotEmpty() == true) { - CrossTextFieldButton { store.dispatch(AddLoginAction.PasswordChanged("")) } + CrossTextFieldButton(contentDescription = Text.Resource(R.string.saved_logins_clear_password)) { + store.dispatch( + AddLoginAction.PasswordChanged(""), + ) + } } }, visualTransformation = PasswordVisualTransformation(), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/EditLoginScreen.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/EditLoginScreen.kt @@ -20,17 +20,25 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTag +import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import mozilla.components.compose.base.annotation.FlexibleWindowLightDarkPreview import mozilla.components.compose.base.button.IconButton +import mozilla.components.compose.base.text.Text import mozilla.components.compose.base.textfield.TextField import mozilla.components.compose.base.theme.AcornTheme import mozilla.components.lib.state.ext.observeAsState @@ -51,6 +59,7 @@ internal fun EditLoginScreen(store: LoginsStore) { loginItem = editState.login, ) }, + modifier = Modifier.semantics { testTagsAsResourceId = true }, ) { paddingValues -> Column( modifier = Modifier @@ -166,11 +175,16 @@ private fun EditLoginUsername(store: LoginsStore, user: String) { horizontal = FirefoxTheme.layout.space.static200, vertical = FirefoxTheme.layout.space.static100, ) - .width(FirefoxTheme.layout.size.containerMaxWidth), + .width(FirefoxTheme.layout.size.containerMaxWidth) + .semantics { + testTag = LoginsTestingTags.EDIT_LOGIN_USERNAME_TEXT_FIELD + }, label = stringResource(R.string.preferences_passwords_saved_logins_username), trailingIcon = { if (editState?.newUsername?.isNotEmpty() == true) { - CrossTextFieldButton { + CrossTextFieldButton( + contentDescription = Text.Resource(R.string.saved_login_clear_username), + ) { store.dispatch(EditLoginAction.UsernameChanged("")) } } @@ -184,6 +198,11 @@ private fun EditLoginPassword(store: LoginsStore, pass: String) { val isPasswordVisible = editState?.isPasswordVisible ?: true val password = editState?.newPassword ?: pass + val focusRequester = remember { FocusRequester() } + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + Row(verticalAlignment = Alignment.CenterVertically) { TextField( value = password, @@ -198,10 +217,19 @@ private fun EditLoginPassword(store: LoginsStore, pass: String) { horizontal = FirefoxTheme.layout.space.static200, vertical = FirefoxTheme.layout.space.static100, ) - .width(FirefoxTheme.layout.size.containerMaxWidth), + .width(FirefoxTheme.layout.size.containerMaxWidth) + .semantics { + testTag = LoginsTestingTags.EDIT_LOGIN_PASSWORD_TEXT_FIELD + } + .focusRequester(focusRequester), label = stringResource(R.string.preferences_passwords_saved_logins_password), trailingIcon = { EyePasswordIconButton( + contentDescription = if (isPasswordVisible) { + Text.Resource(R.string.saved_login_hide_password) + } else { + Text.Resource(R.string.saved_login_reveal_password) + }, isPasswordVisible = isPasswordVisible, onTrailingIconClick = { store.dispatch( @@ -212,7 +240,9 @@ private fun EditLoginPassword(store: LoginsStore, pass: String) { }, ) if (editState?.newPassword?.isNotEmpty() == true) { - CrossTextFieldButton { + CrossTextFieldButton( + contentDescription = Text.Resource(R.string.saved_logins_clear_password), + ) { store.dispatch(EditLoginAction.PasswordChanged("")) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginDetailsScreen.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginDetailsScreen.kt @@ -33,6 +33,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTag +import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview @@ -47,6 +50,7 @@ import mozilla.components.compose.base.menu.DropdownMenu import mozilla.components.compose.base.menu.MenuItem import mozilla.components.compose.base.snackbar.Snackbar import mozilla.components.compose.base.snackbar.displaySnackbar +import mozilla.components.compose.base.text.Text import mozilla.components.compose.base.textfield.TextField import mozilla.components.lib.state.ext.observeAsState import org.mozilla.fenix.R @@ -177,15 +181,11 @@ private fun LoginDetailMenu( DropdownMenu( menuItems = listOf( MenuItem.TextItem( - text = mozilla.components.compose.base.text.Text.Resource( - R.string.login_detail_menu_edit_button, - ), + text = Text.Resource(R.string.login_detail_menu_edit_button), onClick = { store.dispatch(DetailLoginMenuAction.EditLoginMenuItemClicked(loginItem)) }, ), MenuItem.TextItem( - text = mozilla.components.compose.base.text.Text.Resource( - R.string.login_detail_menu_delete_button, - ), + text = Text.Resource(R.string.login_detail_menu_delete_button), onClick = { store.dispatch( DetailLoginMenuAction.DeleteLoginMenuItemClicked( @@ -298,9 +298,18 @@ private fun LoginDetailsPassword( modifier = Modifier .padding(horizontal = FirefoxTheme.layout.space.static200) .wrapContentHeight() - .width(FirefoxTheme.layout.size.containerMaxWidth), + .width(FirefoxTheme.layout.size.containerMaxWidth) + .semantics { + testTagsAsResourceId = true + testTag = LoginsTestingTags.LOGIN_DETAILS_PASSWORD_TEXT_FIELD + }, trailingIcon = { EyePasswordIconButton( + contentDescription = if (isPasswordVisible) { + Text.Resource(R.string.saved_login_hide_password) + } else { + Text.Resource(R.string.saved_login_reveal_password) + }, isPasswordVisible = isPasswordVisible, onTrailingIconClick = { isPasswordVisible = !isPasswordVisible }, ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginsTestingTags.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginsTestingTags.kt @@ -0,0 +1,35 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.settings.logins.ui + +internal object LoginsTestingTags { + + // Saved logins list + const val SAVED_LOGINS_LIST = "saved.logins.list" + + // Saved login item + const val SAVED_LOGINS_LIST_ITEM = "saved.logins.list.item" + + // Saved logins search + const val SAVED_LOGINS_PASSWORD_SEARCH_FIELD = "saved.logins.password.search.field" + + // Add login host name + const val ADD_LOGIN_HOST_NAME_TEXT_FIELD = "logins.add.host.name.text.field" + + // Add login user name + const val ADD_LOGIN_USER_NAME_TEXT_FIELD = "logins.add.user.name.text.field" + + // Add login password + const val ADD_LOGIN_PASSWORD_TEXT_FIELD = "logins.add.password.text.field" + + // Edit login password + const val EDIT_LOGIN_PASSWORD_TEXT_FIELD = "logins.edit.password.text.field" + + // Edit login username + const val EDIT_LOGIN_USERNAME_TEXT_FIELD = "logins.edit.username.text.field" + + // Login details password + const val LOGIN_DETAILS_PASSWORD_TEXT_FIELD = "login.details.password.text.field" +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/SavedLoginsScreen.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/SavedLoginsScreen.kt @@ -40,6 +40,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.CollectionInfo import androidx.compose.ui.semantics.collectionInfo import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTag +import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -133,6 +135,7 @@ private fun LoginsList(store: LoginsStore) { ) }, contentWindowInsets = WindowInsets(0.dp), + modifier = Modifier.semantics { testTagsAsResourceId = true }, ) { paddingValues -> if (state.searchText.isNullOrEmpty() && state.loginItems.isEmpty()) { EmptyList(dispatcher = store::dispatch, paddingValues = paddingValues) @@ -149,6 +152,7 @@ private fun LoginsList(store: LoginsStore) { .width(FirefoxTheme.layout.size.containerMaxWidth) .weight(1f, false) .semantics { + testTag = LoginsTestingTags.SAVED_LOGINS_LIST collectionInfo = CollectionInfo(rowCount = state.loginItems.size, columnCount = 1) }, @@ -164,6 +168,9 @@ private fun LoginsList(store: LoginsStore) { isSelected = false, onClick = { store.dispatch(LoginClicked(item)) }, description = item.username.trimmed(), + modifier = Modifier.semantics { + testTag = LoginsTestingTags.SAVED_LOGINS_LIST_ITEM + ".${item.url.trimmed()}" + }, ) } } @@ -185,6 +192,7 @@ private fun AddPasswordItem( label = stringResource(R.string.preferences_logins_add_login_2), modifier = modifier, beforeIconPainter = painterResource(iconsR.drawable.mozac_ic_plus_24), + description = stringResource(R.string.saved_logins_add_new_login_button_content_description), onClick = { onAddPasswordClicked() }, ) } @@ -306,10 +314,13 @@ private fun LoginsListTopBar( ) } - IconButton(onClick = { searchActive = true }, contentDescription = null) { + IconButton( + onClick = { searchActive = true }, + contentDescription = stringResource(R.string.preferences_passwords_saved_logins_search_2), + ) { Icon( painter = painterResource(iconsR.drawable.mozac_ic_search_24), - contentDescription = stringResource(R.string.preferences_passwords_saved_logins_search_2), + contentDescription = null, ) } }, @@ -336,6 +347,9 @@ private fun SearchBar( }, errorText = "", modifier = Modifier + .semantics { + testTag = LoginsTestingTags.SAVED_LOGINS_PASSWORD_SEARCH_FIELD + } .fillMaxWidth() .focusRequester(focusRequester), trailingIcon = { @@ -349,7 +363,9 @@ private fun SearchBar( ), ) }, - contentDescription = null, + contentDescription = stringResource( + R.string.saved_logins_clear_search_text_button_content_description, + ), ) { Icon( painter = painterResource(iconsR.drawable.mozac_ic_cross_24), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/webcompat/ui/WebCompatReporter.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/webcompat/ui/WebCompatReporter.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.webcompat.ui import androidx.activity.compose.BackHandler import androidx.compose.foundation.ScrollState import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -17,13 +16,11 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -55,6 +52,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import mozilla.components.compose.base.Dropdown import mozilla.components.compose.base.button.FilledButton +import mozilla.components.compose.base.button.OutlinedButton import mozilla.components.compose.base.button.TextButton import mozilla.components.compose.base.menu.MenuItem import mozilla.components.compose.base.modifier.thenConditional @@ -245,98 +243,74 @@ fun WebCompatReporter( } } - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = Modifier.height(16.dp)) - Row( + OutlinedButton( + text = stringResource(id = R.string.webcompat_reporter_preview_report), modifier = Modifier - .clickable { - previewSheetVisible = true - store.dispatch(WebCompatReporterAction.OpenPreviewClicked) - } - .padding(vertical = 8.dp) .fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - ) { - Text( - text = stringResource(id = R.string.webcompat_reporter_preview_report), - modifier = Modifier, - color = FirefoxTheme.colors.textPrimary, - style = FirefoxTheme.typography.subtitle2, - ) - Icon( - painter = painterResource(R.drawable.ic_arrowhead_right), - contentDescription = "", - ) - } - - Spacer(modifier = Modifier.height(4.dp)) - - HorizontalDivider() + contentColor = MaterialTheme.colorScheme.primary, + onClick = { + previewSheetVisible = true + store.dispatch(WebCompatReporterAction.OpenPreviewClicked) + }, + ) - Spacer(modifier = Modifier.height(20.dp)) + Spacer(modifier = Modifier.height(16.dp)) - Row( + FilledButton( + text = stringResource(id = R.string.webcompat_reporter_send), modifier = Modifier .fillMaxWidth() - .padding(vertical = 16.dp), - verticalAlignment = Alignment.CenterVertically, + .semantics { + testTagsAsResourceId = true + testTag = BROKEN_SITE_REPORTER_SEND_BUTTON + }, + enabled = state.isSubmitEnabled, ) { - // Note: the "Add more info" button is not meant for Release, so we're only - // enabling it in Beta and Nightly/Debug - if (Config.channel.isBeta || Config.channel.isNightlyOrDebug) { - Text( - text = stringResource(id = R.string.webcompat_reporter_add_more_info), - modifier = Modifier - .clickable { - store.dispatch(WebCompatReporterAction.AddMoreInfoClicked) - }, - style = FirefoxTheme.typography.body2, - color = MaterialTheme.colorScheme.tertiary, - textDecoration = TextDecoration.Underline, - ) + store.dispatch(WebCompatReporterAction.SendReportClicked) + } - Spacer(modifier = Modifier.width(24.dp)) - } + Spacer(modifier = Modifier.height(16.dp)) - Row( - modifier = Modifier.weight(1f), - horizontalArrangement = Arrangement.End, - ) { - TextButton( - text = stringResource(id = R.string.webcompat_reporter_cancel), - onClick = { - store.dispatch(WebCompatReporterAction.CancelClicked) - }, - ) + TextButton( + text = stringResource(id = R.string.webcompat_reporter_cancel), + modifier = Modifier + .fillMaxWidth(), + onClick = { + store.dispatch(WebCompatReporterAction.CancelClicked) + }, + ) - Spacer(modifier = Modifier.width(10.dp)) - - FilledButton( - text = stringResource(id = R.string.webcompat_reporter_send), - modifier = Modifier - .wrapContentSize() - .semantics { - testTagsAsResourceId = true - testTag = BROKEN_SITE_REPORTER_SEND_BUTTON - }, - enabled = state.isSubmitEnabled, - ) { - store.dispatch(WebCompatReporterAction.SendReportClicked) - } - } + // Note: the "Add more info" button is not meant for Release, so we're only + // enabling it in Beta and Nightly/Debug + if (Config.channel.isBeta || Config.channel.isNightlyOrDebug) { + Spacer(modifier = Modifier.height(16.dp)) + + Text( + text = stringResource(id = R.string.webcompat_reporter_add_more_info), + modifier = Modifier + .fillMaxWidth() + .clickable { + store.dispatch(WebCompatReporterAction.AddMoreInfoClicked) + }, + style = FirefoxTheme.typography.body2.copy(textAlign = TextAlign.Center), + color = MaterialTheme.colorScheme.tertiary, + textDecoration = TextDecoration.Underline, + ) } } } if (previewSheetVisible) { - WebCompatReporterPreviewSheet( - previewJSON = state.previewJSON, - onDismissRequest = { previewSheetVisible = false }, - onSendClick = { store.dispatch(WebCompatReporterAction.SendReportClicked) }, - isSendButtonEnabled = state.isSubmitEnabled, - ) - } + WebCompatReporterPreviewSheet( + previewJSON = state.previewJSON, + onDismissRequest = { previewSheetVisible = false }, + onSendClick = { store.dispatch(WebCompatReporterAction.SendReportClicked) }, + isSendButtonEnabled = state.isSubmitEnabled, + ) } +} /** * Helper function used to obtain the list of dropdown menu items derived from [BrokenSiteReason]. diff --git a/mobile/android/fenix/app/src/main/res/values-hy-rAM/strings.xml b/mobile/android/fenix/app/src/main/res/values-hy-rAM/strings.xml @@ -735,7 +735,7 @@ <!-- Preference for enabling "HTTPS-Only" mode --> <string name="preferences_https_only_title">Միայն HTTPS կերպ</string> <!-- Preference title for using the screen lock to hide tabs in private browsing --> - <string name="preferences_pbm_lock_screen_title">Օգտագործեք էկրանի կողպումը մասնավոր դիտարկման ժամանակ ներդիրները թաքցնելու համար</string> + <string name="preferences_pbm_lock_screen_title">Օգտագործեք էկրանի կողպումը գաղտնի դիտարկման ժամանակ ներդիրները թաքցնելու համար</string> <!-- Informs the user how to access the tabs when "Use screen lock to hide tabs in private browsing" is enabled --> <string name="preferences_pbm_lock_screen_summary_3">Դիտեք ներդիրները ձեր մատնահետքի, PIN կոդի կամ դեմքով ապակողպման միջոցով: Սա միացնելը նաև կանխում է էկրանի կորզումը և համօգտագործումը:</string> <!-- Label for cookie banner section in quick settings panel. --> diff --git a/mobile/android/fenix/app/src/main/res/values/strings.xml b/mobile/android/fenix/app/src/main/res/values/strings.xml @@ -2475,7 +2475,10 @@ <string name="edit_login_navigate_back_button_content_description">Navigate back</string> <!-- Content description, used by tools like screenreaders, to press on the edit login button. --> <string name="edit_login_button_content_description">Edit login</string> - + <!-- Content description, used by tools like screenreaders, to press on the add new login button. --> + <string name="saved_logins_add_new_login_button_content_description">Add new login</string> + <!-- Content description, used by tools like screenreaders, to press on the clear search text button. --> + <string name="saved_logins_clear_search_text_button_content_description">Clear search text</string> <!-- Content Description (for screenreaders etc) read for the button to open a site in logins --> <string name="saved_login_open_site">Open site in browser</string> <!-- Content Description (for screenreaders etc) read for the button to reveal a password in logins --> diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AutocompleteTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AutocompleteTest.kt @@ -32,7 +32,6 @@ import org.mozilla.geckoview.GeckoResult import org.mozilla.geckoview.GeckoSession import org.mozilla.geckoview.GeckoSession.PromptDelegate import org.mozilla.geckoview.GeckoSession.PromptDelegate.AutocompleteRequest -import org.mozilla.geckoview.TranslationsController import org.mozilla.geckoview.test.rule.GeckoSessionTestRule import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled @@ -1454,6 +1453,64 @@ class AutocompleteTest : BaseSessionTest() { } @Test + fun formSubmissionWithUnchangedCreditCardShouldNotTriggerSave() { + val ccName = "Jane Doe" + val ccNumber = "5555444433331111" + val ccExpMonth = "6" + val ccExpYear = "2024" + val savedCreditCard = CreditCard.Builder() + .guid("test-guid-1") + .name(ccName) + .number(ccNumber) + .expirationMonth(ccExpMonth) + .expirationYear(ccExpYear) + .build() + + val savedCreditCards = arrayOf(savedCreditCard) + + mainSession.loadTestPath(CC_FORM_HTML_PATH) + mainSession.waitForPageStop() + + // Setup delegates for fetching data and handling prompts. + sessionRule.delegateUntilTestEnd(object : StorageDelegate, PromptDelegate { + @AssertCalled + override fun onCreditCardFetch(): GeckoResult<Array<CreditCard>> { + return GeckoResult.fromValue(savedCreditCards) + } + + // These should NOT be called because no information has changed. + @AssertCalled(count = 0) + override fun onCreditCardSave(creditCard: CreditCard) = Unit + + @AssertCalled(count = 0) + override fun onCreditCardSave( + session: GeckoSession, + request: AutocompleteRequest<CreditCardSaveOption>, + ): GeckoResult<PromptDelegate.PromptResponse> { + // This block should not be reached. If it is, the test will fail. + return GeckoResult.fromValue(request.dismiss()) + } + }) + + // Fill in the fields with the same saved data + mainSession.evaluateJS("document.querySelector('#name').focus()") + mainSession.evaluateJS("document.querySelector('#name').value = '$ccName'") + mainSession.evaluateJS("document.querySelector('#name').focus()") + mainSession.evaluateJS("document.querySelector('#number').value = '$ccNumber'") + mainSession.evaluateJS("document.querySelector('#number').focus()") + mainSession.evaluateJS("document.querySelector('#expMonth').value = '$ccExpMonth'") + mainSession.evaluateJS("document.querySelector('#expMonth').focus()") + mainSession.evaluateJS("document.querySelector('#expYear').value = '$ccExpYear'") + mainSession.evaluateJS("document.querySelector('#expYear').focus()") + + // Submit the form + mainSession.evaluateJS("document.querySelector('form').requestSubmit()") + + // Wait for the form to submit + mainSession.waitForRoundTrip() + } + + @Test fun creditCardUpdateAccept() { val ccName = "MyCard" val ccNumber1 = "5105105105105100" diff --git a/mobile/locales/l10n-changesets.json b/mobile/locales/l10n-changesets.json @@ -6,7 +6,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "an": { "pin": false, @@ -15,7 +15,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ar": { "pin": false, @@ -24,7 +24,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ast": { "pin": false, @@ -33,7 +33,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "az": { "pin": false, @@ -42,7 +42,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "be": { "pin": false, @@ -51,7 +51,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "bg": { "pin": false, @@ -60,7 +60,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "bn": { "pin": false, @@ -69,7 +69,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "br": { "pin": false, @@ -78,7 +78,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "bs": { "pin": false, @@ -87,7 +87,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ca": { "pin": false, @@ -96,7 +96,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "cak": { "pin": false, @@ -105,7 +105,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "cs": { "pin": false, @@ -114,7 +114,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "cy": { "pin": false, @@ -123,7 +123,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "da": { "pin": false, @@ -132,7 +132,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "de": { "pin": false, @@ -141,7 +141,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "dsb": { "pin": false, @@ -150,7 +150,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "el": { "pin": false, @@ -159,7 +159,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "en-CA": { "pin": false, @@ -168,7 +168,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "en-GB": { "pin": false, @@ -177,7 +177,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "eo": { "pin": false, @@ -186,7 +186,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-AR": { "pin": false, @@ -195,7 +195,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-CL": { "pin": false, @@ -204,7 +204,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-ES": { "pin": false, @@ -213,7 +213,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "es-MX": { "pin": false, @@ -222,7 +222,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "et": { "pin": false, @@ -231,7 +231,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "eu": { "pin": false, @@ -240,7 +240,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fa": { "pin": false, @@ -249,7 +249,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ff": { "pin": false, @@ -258,7 +258,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fi": { "pin": false, @@ -267,7 +267,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fr": { "pin": false, @@ -276,7 +276,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "fy-NL": { "pin": false, @@ -285,7 +285,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ga-IE": { "pin": false, @@ -294,7 +294,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gd": { "pin": false, @@ -303,7 +303,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gl": { "pin": false, @@ -312,7 +312,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gn": { "pin": false, @@ -321,7 +321,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "gu-IN": { "pin": false, @@ -330,7 +330,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "he": { "pin": false, @@ -339,7 +339,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hi-IN": { "pin": false, @@ -348,7 +348,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hr": { "pin": false, @@ -357,7 +357,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hsb": { "pin": false, @@ -366,7 +366,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hu": { "pin": false, @@ -375,7 +375,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "hy-AM": { "pin": false, @@ -384,7 +384,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ia": { "pin": false, @@ -393,7 +393,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "id": { "pin": false, @@ -402,7 +402,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "is": { "pin": false, @@ -411,7 +411,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "it": { "pin": false, @@ -420,7 +420,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ja": { "pin": false, @@ -429,7 +429,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ka": { "pin": false, @@ -438,7 +438,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "kab": { "pin": false, @@ -447,7 +447,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "kk": { "pin": false, @@ -456,7 +456,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "km": { "pin": false, @@ -465,7 +465,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "kn": { "pin": false, @@ -474,7 +474,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ko": { "pin": false, @@ -483,7 +483,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lij": { "pin": false, @@ -492,7 +492,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lo": { "pin": false, @@ -501,7 +501,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lt": { "pin": false, @@ -510,7 +510,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ltg": { "pin": false, @@ -519,7 +519,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "lv": { "pin": false, @@ -528,7 +528,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "meh": { "pin": false, @@ -537,7 +537,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "mix": { "pin": false, @@ -546,7 +546,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ml": { "pin": false, @@ -555,7 +555,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "mr": { "pin": false, @@ -564,7 +564,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ms": { "pin": false, @@ -573,7 +573,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "my": { "pin": false, @@ -582,7 +582,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "nb-NO": { "pin": false, @@ -591,7 +591,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ne-NP": { "pin": false, @@ -600,7 +600,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "nl": { "pin": false, @@ -609,7 +609,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "nn-NO": { "pin": false, @@ -618,7 +618,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "oc": { "pin": false, @@ -627,7 +627,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pa-IN": { "pin": false, @@ -636,7 +636,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pl": { "pin": false, @@ -645,7 +645,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pt-BR": { "pin": false, @@ -654,7 +654,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "pt-PT": { "pin": false, @@ -663,7 +663,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "rm": { "pin": false, @@ -672,7 +672,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ro": { "pin": false, @@ -681,7 +681,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ru": { "pin": false, @@ -690,7 +690,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sk": { "pin": false, @@ -699,7 +699,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sl": { "pin": false, @@ -708,7 +708,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "son": { "pin": false, @@ -717,7 +717,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sq": { "pin": false, @@ -726,7 +726,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sr": { "pin": false, @@ -735,7 +735,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "sv-SE": { "pin": false, @@ -744,7 +744,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ta": { "pin": false, @@ -753,7 +753,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "te": { "pin": false, @@ -762,7 +762,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "th": { "pin": false, @@ -771,7 +771,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "tl": { "pin": false, @@ -780,7 +780,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "tr": { "pin": false, @@ -789,7 +789,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "trs": { "pin": false, @@ -798,7 +798,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "uk": { "pin": false, @@ -807,7 +807,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "ur": { "pin": false, @@ -816,7 +816,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "uz": { "pin": false, @@ -825,7 +825,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "vi": { "pin": false, @@ -834,7 +834,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "wo": { "pin": false, @@ -843,7 +843,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "xh": { "pin": false, @@ -852,7 +852,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "zam": { "pin": false, @@ -861,7 +861,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "zh-CN": { "pin": false, @@ -870,7 +870,7 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" }, "zh-TW": { "pin": false, @@ -879,6 +879,6 @@ "android-arm", "android-multilocale" ], - "revision": "aa40f18dcfd7d65b8bad9eb220957420414f202c" + "revision": "a2a9da6ab451f6b75117d3b6dcc86402b038de64" } } \ No newline at end of file diff --git a/mobile/shared/modules/geckoview/GeckoViewAutocomplete.sys.mjs b/mobile/shared/modules/geckoview/GeckoViewAutocomplete.sys.mjs @@ -10,6 +10,7 @@ ChromeUtils.defineESModuleGetters(lazy, { EventDispatcher: "resource://gre/modules/Messaging.sys.mjs", GeckoViewPrompter: "resource://gre/modules/GeckoViewPrompter.sys.mjs", AddressRecord: "resource://gre/modules/shared/AddressRecord.sys.mjs", + CreditCardRecord: "resource://gre/modules/shared/CreditCardRecord.sys.mjs", }); ChromeUtils.defineLazyGetter(lazy, "LoginInfo", () => @@ -265,7 +266,7 @@ export class CreditCard { } toGecko() { - return { + let creditCard = { version: this.version, "cc-name": this.name, "cc-number": this.number, @@ -274,6 +275,10 @@ export class CreditCard { "cc-type": this.type, guid: this.guid, }; + + lazy.CreditCardRecord.computeFields(creditCard); + + return creditCard; } } diff --git a/netwerk/base/nsInputStreamPump.cpp b/netwerk/base/nsInputStreamPump.cpp @@ -73,7 +73,10 @@ static nsresult CallPeekFunc(nsIInputStream* aInStream, void* aClosure, nsresult nsInputStreamPump::PeekStream(PeekSegmentFun callback, void* closure) { RecursiveMutexAutoLock lock(mMutex); - MOZ_ASSERT(mAsyncStream, "PeekStream called without stream"); + if (!mAsyncStream) { + MOZ_DIAGNOSTIC_ASSERT(false, "PeekStream called without stream"); + return NS_ERROR_NOT_AVAILABLE; + } nsresult rv = CreateBufferedStreamIfNeeded(); NS_ENSURE_SUCCESS(rv, rv); diff --git a/netwerk/dns/effective_tld_names.dat b/netwerk/dns/effective_tld_names.dat @@ -5,8 +5,8 @@ // Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, // rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. -// VERSION: 2025-12-04_07-50-09_UTC -// COMMIT: ea600e443a922cd3f1e2f96e1db3f860d0b097ea +// VERSION: 2025-12-06_18-27-07_UTC +// COMMIT: 24874d0227995dff18964458432da2b987eb4837 // Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. @@ -6816,7 +6816,7 @@ org.zw // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2025-11-08T15:16:38Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2025-12-06T15:17:27Z // This list is auto-generated, don't edit it manually. // aaa : American Automobile Association, Inc. // https://www.iana.org/domains/root/db/aaa.html @@ -10194,7 +10194,7 @@ solutions // https://www.iana.org/domains/root/db/song.html song -// sony : Sony Corporation +// sony : Sony Group Corporation // https://www.iana.org/domains/root/db/sony.html sony diff --git a/security/ct/CTKnownLogs.h b/security/ct/CTKnownLogs.h @@ -14,7 +14,7 @@ #include <stddef.h> -static const PRTime kCTExpirationTime = INT64_C(1770893503000000); +static const PRTime kCTExpirationTime = INT64_C(1771239290000000); namespace mozilla::ct { diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h @@ -681,4 +681,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1773312662261000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1773658462541000); diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include <stdint.h> -const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); +const PRTime gPreloadListExpirationTime = INT64_C(1776077656422000); %% 0--1.de, 1 0-0.io, 1 @@ -21,7 +21,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 0.com.ms, 1 0.sb, 1 00.eco, 1 -00000000-0000-0000-0000-000000000000.xyz, 1 000000039.xyz, 1 0000031.xyz, 1 00010110.nl, 1 @@ -732,7 +731,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 127661.com, 1 1288366.com, 1 129.co, 1 -12apostleshotel.com, 1 12fkcdtcetteefqv.myfritz.net, 1 12go.asia, 1 12go.co, 1 @@ -804,7 +802,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 15-montorgueil.com, 1 150mpg.com, 1 1511774230.rsc.cdn77.org, 1 -1517.ch, 1 +1517.ch, 0 1517598.com, 1 1517668.com, 1 1517669.com, 1 @@ -1236,7 +1234,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 1me.cz, 1 1mgt.ru, 1 1montre.fr, 1 -1my.me, 1 +1my.me, 0 1nf.me, 1 1nian.vip, 1 1node.site, 1 @@ -1320,7 +1318,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 1x1.re, 1 1x2020.xyz, 1 1x2betwinner.com, 1 -1x2magazine.eu, 1 1x4.com.au, 1 1x88.net, 1 1xaja.com, 1 @@ -1730,12 +1727,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 24hrbrandbash.com, 1 24images.com, 1 24k.co.jp, 1 -24meg.com, 1 24onlain.tk, 1 -24see.com, 1 -24share.com, 1 24slides.com, 1 -24status.com, 1 24webservice.nl, 1 24x7aircargoservices.co.in, 1 24x7serversupport.io, 1 @@ -2067,7 +2060,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 360stone.com, 1 360system.com, 1 360techpartner.com, 1 -360trust.com, 1 360videoshare.com, 1 360visualmedia.co.uk, 1 360vrs.com, 1 @@ -2196,8 +2188,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 380222444.com, 0 38138938.com, 1 38317.tk, 1 -3837k.com, 0 -3837x.com, 0 3838onndo.tk, 1 3839.ca, 1 383aaa.com, 1 @@ -2827,11 +2817,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 51dazhe.com, 1 51evar.com, 1 51fishing.com, 1 -51free.com, 1 51fss.marketing, 1 51lavanderiaindustrial.com.br, 1 51life.com, 1 -51logo.com, 1 51nullacht.de, 1 51pic.com, 1 51pig.com, 1 @@ -3521,7 +3509,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 777365t.com, 1 7776321.com, 0 777coin.com, 1 -777mage.com, 1 77909a.com, 0 77909b.com, 0 77909c.com, 0 @@ -3558,7 +3545,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 7across.com, 1 7aga7.mk, 1 7akawyna.tk, 1 -7b.gg, 1 7colli.it, 1 7comm.com.br, 1 7datarecovery.com, 1 @@ -3687,7 +3673,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 81alarm.cz, 1 81klima.cz, 1 81klima.sk, 1 -81uc.com, 1 8203d88.com, 1 8207d88.com, 1 8208d88.com, 1 @@ -3974,7 +3959,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 8me.nl, 1 8n.pw, 1 8shequapp.com, 1 -8show.com, 1 8t8.eu, 1 8tech.com.hk, 1 8therate.com, 1 @@ -4598,7 +4582,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 9617.cf, 1 9617818.net, 1 9618.cf, 1 -96181.com, 1 9619.cf, 1 9620.cf, 1 96200.com, 1 @@ -4618,7 +4601,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1775731853399000); 9632.cf, 1 9633.cf, 1 96448.com, 1 -96577.com, 1 96605.com, 1 9666ks.com, 1 96685.com, 1 @@ -5649,7 +5631,6 @@ absinsurance.com, 1 absolab.xyz, 1 absolem.cc, 1 absoluav.com, 1 -absolugroupe.com, 1 absolute.digital, 1 absoluteblack.cc, 1 absolutebritney.com, 1 @@ -5671,6 +5652,7 @@ abssoft.tk, 1 abstechs.ae, 1 abstimmen.online, 1 abstr-int-cartogr-assoc.net, 1 +abstract27.com, 1 abstractbarista.com, 1 abstractbarista.net, 0 abstractive.ai, 1 @@ -5903,7 +5885,7 @@ acebeam.com, 1 acebovirtual.tk, 1 acecardiologyclinic.com, 1 acectamentit.tk, 1 -acedstudy.com, 1 +acedstudy.com, 0 aceenergy.com.tw, 1 acefishing.tk, 1 acefront.co.uk, 1 @@ -6195,6 +6177,7 @@ activehealth.com, 1 activehire.co.uk, 1 activeleisure.ie, 1 activelife.travel, 1 +activemoneymanage.com, 0 activenl.co.uk, 1 activeplatesystem.ga, 1 activeprospect.com, 1 @@ -6319,7 +6302,6 @@ ada.eco, 1 ada.gov, 1 adab-mans.tk, 1 adac-musikreisen.de, 1 -adachansa.de, 1 adachi.work, 1 adacomputerscience.org, 1 adacprod.fr, 1 @@ -6422,7 +6404,6 @@ adbglobal.com, 1 adblockextreme.com, 1 adblockextreme.net, 1 adblockextreme.org, 1 -adboos.com, 1 adbw.xyz, 1 adc-dentalcare.com, 0 adc64.com, 1 @@ -6509,7 +6490,6 @@ adelightfulglow.com, 1 adelina.com.br, 0 adelinemerrick.com, 1 adelonline.tk, 1 -adelphiawines.com, 1 ademaulana.tk, 1 adenergetics.tech, 1 adenhurra.cf, 1 @@ -6819,6 +6799,7 @@ adult-block.com, 1 adultbizz.eu, 1 adulteducation.org.uk, 1 adultgames.pro, 1 +adultgeek.com, 1 adulttrust.com, 1 aduro.com.tr, 1 adurra.com, 1 @@ -6845,7 +6826,6 @@ advancealabama.gov, 1 advancecessnock.com.au, 1 advanced-ict.info, 1 advanced-online.eu, 1 -advancedacupuncture.net, 1 advancedaquaticservice.com, 1 advancedbotoxclinic.com, 1 advancedbuildings.com.au, 1 @@ -7421,7 +7401,6 @@ afterskool.eu, 1 afterstack.net, 1 aftodioikisi.gr, 1 aftonbladet.se, 1 -aftontickets.com, 1 afuturewithoutfear.org, 1 afuturewithoutfear.us, 1 afuzion.com, 1 @@ -8055,7 +8034,6 @@ aikidozentrum.com, 1 aikijutsu.tk, 1 aikiva.com, 1 aikoly.com, 1 -ailagpt.com, 1 aileenwatt.co.uk, 1 ailitonia.com, 1 ailladearousa.com, 1 @@ -8533,7 +8511,6 @@ aisera.com, 1 aish.ml, 1 aishima.com, 1 aisi316l.net, 1 -aisidehustler.com, 1 aising.jp, 1 aisp.sg, 1 aispirit.tk, 1 @@ -8578,6 +8555,7 @@ aixlab.de, 1 aixm.aero, 1 aixploringprovence.com, 1 aixue.net, 1 +aizhuan.com, 1 aizxxs.com, 1 aizxxs.net, 1 aj-laixada.tk, 1 @@ -8828,7 +8806,6 @@ aktiv-naturheilmittel.ch, 1 aktiv-naturheilmittel.de, 1 aktiv.pl, 1 aktivace.eu, 1 -aktive-arbeitslose.at, 1 aktivierungscenter.de, 1 aktivitetatil.com, 1 aktivpark-lumdatal.de, 1 @@ -8936,7 +8913,6 @@ alamoranchhandyman.com, 1 alamotownshipmi.gov, 1 alan-turnbull.co.uk, 1 alana.com.ua, 1 -alanalarana.com, 1 alanberger.me.uk, 1 alanbleiweiss.com, 1 alanburr.us.eu.org, 1 @@ -9076,6 +9052,7 @@ albertvillemn.gov, 1 albeso.ml, 1 albi-tourisme.fr, 1 albilaga.id, 1 +albinliljestrand.se, 1 albinonderdelen.nl, 1 albinsoft.es, 1 albinvega.tk, 1 @@ -9121,6 +9098,7 @@ alchemiya.ru, 1 alchemy.gr, 1 alchemy.net, 1 alchemyinfusionco.com.au, 1 +alchemytechconnect.com, 1 alchemywellness.health, 1 alchevsk-news.ru, 1 alchevsknews.ru, 1 @@ -9407,6 +9385,7 @@ alfa-pack.com.ua, 1 alfa-reserve.tk, 1 alfa-tech.su, 1 alfaair.aero, 1 +alfabetagamma.com, 0 alfabetajuega.com, 1 alfabuster.com, 1 alfacharlie.co, 0 @@ -9500,6 +9479,7 @@ alhsfb.com, 0 alhuqul-kh.com, 1 ali-shariati.tk, 1 alia-helianthi.tk, 1 +aliads.com, 1 aliakpoyraz.com, 1 alialkurdy.tk, 1 aliamakeup.com, 1 @@ -9517,6 +9497,7 @@ alibamu.com, 1 alibamu.org, 1 alibi-ua.com.ua, 1 alibip.de, 1 +alicafe.com, 1 alicante-spain.tk, 1 alice-memorial.de, 1 alice.tw, 1 @@ -9558,6 +9539,7 @@ alifeadjacent.com, 1 alifeinbinary.com, 1 alight.ge, 1 alightwell.com, 1 +aligift.com, 1 align-pilates.lt, 1 align27.com, 1 alignancekinesiologie.fr, 1 @@ -9660,6 +9642,7 @@ alkel.info, 1 alkemy.mx, 1 alkesznevelde.hu, 1 alkibiades-gc.de, 1 +alko-centr.ru, 1 alko-stop.cf, 1 alko-stop.ml, 1 alkoferma.gq, 1 @@ -9684,6 +9667,8 @@ all-inhealth.com, 1 all-mountains.fr, 1 all-music.ml, 1 all-music.tk, 1 +all-payroll-solutions.com, 1 +all-payroll-solutions.de, 1 all-pics.tk, 1 all-rating.tk, 1 all-seo.tk, 1 @@ -9933,6 +9918,7 @@ allmobilenews.tk, 1 allmousepads.com, 0 allmoviesonline.tk, 1 allnaijagists.com.ng, 1 +allnations4christ.org, 1 allnodes.com, 1 allnovosibirsk.tk, 1 allns.fr, 1 @@ -10030,7 +10016,7 @@ allur-club.cf, 1 allurebikerental.com, 1 allureclinic.pt, 1 alluremedicalaesthetic.com, 1 -allurescarves.com, 1 +allurescarves.com, 0 alluringdesigns.tk, 1 alluvion.studio, 1 allvideofoot.tk, 1 @@ -10581,7 +10567,6 @@ amabiligranilhas.com, 1 amac.tv, 1 amacuk.co.uk, 1 amad-bargh.com, 1 -amadera.com, 1 amaderforum.tk, 1 amadeusproject.cf, 1 amadin.tk, 1 @@ -10828,7 +10813,6 @@ americanbuzz.tk, 1 americancanyon.gov, 1 americancasinoguide.shop, 1 americanclimatecorps.gov, 1 -americancrane.com, 1 americandisinfectingassociation.com, 1 americandisinfectingassociation.org, 1 americandrugrehabs.com, 1 @@ -11668,6 +11652,7 @@ anewlife.it, 1 anewperspectiveconstruction.com, 1 anex.us, 1 anexperimentedblog.tk, 1 +anextraordinaryday.net, 1 anfadern.com, 1 anfieldbc.co.uk, 1 anfilada.info, 1 @@ -11991,10 +11976,10 @@ anker-wladyslawowo.pl, 1 anketlekazan.net, 1 ankicozmorobot.com, 1 ankitpati.in, 1 -ankitverma.me, 1 ankiuser.net, 1 ankiweb.net, 1 anklepainclinic.sg, 1 +anklesdown.com, 0 ankos.cf, 1 ankosofttech.com, 1 ankosofttech.de, 1 @@ -12105,7 +12090,6 @@ annunciationbvmchurch.org, 1 annuncisesso.tk, 1 annyaurora.net, 1 annygraces.com, 1 -annymail.com, 1 anokacountybuys.gov, 1 anokawineandspirits.gov, 1 anol.loan, 1 @@ -12165,6 +12149,7 @@ anp.it, 1 anpaju.gq, 1 anpigabon.ga, 1 anquankongjian.com, 1 +anquanssl.com, 1 anrworldwide.com, 1 ans-ge.ch, 0 ans-solutions.com, 1 @@ -12633,7 +12618,6 @@ apartmentregister.com.au, 1 apartments-promajna.tk, 1 apartments.co.nz, 1 apartrentrotterdam.nl, 1 -apartyakamoz.com, 1 apatransport.com, 1 apbassettsolicitors.co.uk, 1 apbforum.tk, 1 @@ -12716,7 +12700,6 @@ api-agri.ga, 1 api-bitrefill.com, 1 api-hany.cf, 1 api.biz.tr, 1 -api.loan, 1 api.lookout.com, 1 api.org.tr, 1 api.recurly.com, 1 @@ -13119,6 +13102,7 @@ aprimatic.msk.ru, 1 aprincesadolar.pt, 1 apriorit.com, 1 aprofunda.art.br, 1 +aprogramozo.hu, 1 apropoaalst.be, 1 apropont.hu, 1 apropotv.ro, 0 @@ -13185,6 +13169,7 @@ aqihub.info, 1 aqlivia.com, 1 aqmetrics.com, 1 aqqrate.com, 1 +aqss.rs, 1 aqu.com, 1 aqua-academy.at, 1 aqua-dom33.ru, 1 @@ -13633,7 +13618,6 @@ argentumonline.tk, 1 argico.com, 1 argo-vision.com, 1 argo-vision.it, 1 -argo.vision, 1 argolacosmetique.ca, 1 argolacosmetique.com, 1 argon18.com, 1 @@ -13822,6 +13806,7 @@ armadilloprojects.co.uk, 1 armadilloroofing.co.uk, 1 armadilloscubatx.com, 1 armado.tk, 1 +armagangultekin.av.tr, 1 armageddonclan.tk, 1 armahackers.tk, 1 armakuni.com, 1 @@ -14511,7 +14496,6 @@ asfalti.it, 1 asfalto.roma.it, 1 asfberbagi.org, 1 asfono.gov, 1 -asg-egy.com, 1 asgard-engineering.com, 1 asgeirolafs.com, 1 asharq.com, 1 @@ -14543,7 +14527,6 @@ ashesdiamonds.com, 1 ashesheriff.gov, 1 ashevillemenshealth.com, 1 ashfak.tk, 1 -ashfordcastle.com, 1 ashgroveclinic.com.au, 1 ashgw.me, 0 ashiba-kagu.com, 1 @@ -14910,7 +14893,6 @@ astarfrommosul.cf, 1 astarfrommosul.ga, 1 astarfrommosul.ml, 1 astariafashion.co.uk, 1 -astarmathsandphysics.com, 1 astateoftrance.tk, 1 asteelflash.com, 0 astekbet.com, 1 @@ -15689,7 +15671,7 @@ auralia.cloud, 1 auralia.net, 1 auraliafirst.com, 1 auraliamusic.com, 1 -auralinna.blog, 1 +auralinna.blog, 0 aurantis.it, 1 aurantis.nl, 1 aurbrowser.tk, 1 @@ -15889,7 +15871,6 @@ auto-arsenal.tk, 1 auto-borse.tk, 1 auto-delchev.com, 1 auto-ecole-du-tursan.fr, 1 -auto-ecole-remparts.fr, 1 auto-graph.eu, 1 auto-help.tk, 1 auto-i-dat.ch, 1 @@ -16028,7 +16009,6 @@ autologix.io, 1 automa.biz, 1 automaatic.com, 1 automagischeberegening.nl, 1 -automaq.com.py, 1 automastercastlerock.com, 1 automatecodes.com, 1 automaticagarage.it, 1 @@ -16625,7 +16605,6 @@ avsd01.com, 1 avstack.io, 1 avstekla.ru, 1 avt-ukraine.com, 1 -avtechno.ru, 1 avtecmedia.com, 0 avto-bazar.tk, 1 avto-signal.cf, 1 @@ -16635,7 +16614,6 @@ avto-signal.ml, 1 avtochip.tk, 1 avtodoki.tk, 1 avtodot.tk, 1 -avtoforex.ru, 1 avtojurist.ml, 1 avtojurist.tk, 1 avtokar12.ru, 1 @@ -16728,6 +16706,7 @@ awo-augsburg.de, 1 awo-bremen.de, 1 awo-sh.de, 1 awoau.com.au, 1 +awqaf.gov.ae, 1 awqaf.gov.ly, 1 awrcourtreporter.com, 1 awrcourtreporters.com, 1 @@ -17016,7 +16995,6 @@ azairline.com, 1 azaleos.com, 1 azalhavayolu.com.tr, 1 azallon.com.br, 1 -azapp-vvv-program-api-dev.azurewebsites.net, 1 azaria.blog, 1 azarkepic.com, 1 azartmania.ga, 1 @@ -17047,7 +17025,6 @@ azeronline.tk, 1 azertyjobs.com, 1 azey.net, 1 azfreaks.tk, 1 -azgaragedoorsrepair.com, 1 azh-kunden.de, 1 azhamevents.com, 1 azhapasa.com, 1 @@ -17857,7 +17834,6 @@ balaskas.gr, 1 balatonlelleapartman.tk, 1 balboa.io, 1 balboa.org.uk, 1 -balboacapital.com, 1 balbus.tk, 1 balca.ga, 1 balcaonet.com.br, 1 @@ -18229,6 +18205,7 @@ baratzegrowshop.com, 1 baravalle.com, 1 baraxolka.ga, 1 baraxolka.ml, 1 +barbara-bertagnolli.co.uk, 1 barbara-fuchs-gruene-fuerth.de, 1 barbarabryce.com, 1 barbaraedanielsantos.ga, 1 @@ -18853,7 +18830,6 @@ bazarfds.com.br, 1 bazarotehijos.com, 1 bazarow.ru, 0 bazdell.com, 0 -bazdidaval.ir, 1 baze.cz, 1 bazel.build, 1 bazhan.wang, 1 @@ -18916,7 +18892,6 @@ bblsa.ch, 0 bbmagnagrecia.it, 0 bbmak.tk, 1 bbmri.fi, 1 -bbmsarauniteam.com, 1 bbnx.net, 1 bbox.org, 1 bbp.ng, 1 @@ -19183,7 +19158,6 @@ beatmalaria.org, 1 beaton.tk, 1 beatquantum.com, 1 beatrice-nightscout.herokuapp.com, 1 -beatrice-raws.org, 1 beatricedailysun.com, 1 beatriz-urbano-vega.tk, 1 beatrizaebischer.ch, 0 @@ -19220,7 +19194,6 @@ beautifulsouth.tk, 1 beauty-blog.gq, 1 beauty-form.ir, 1 beauty-haircare.tk, 1 -beauty-salon-lino.com, 1 beauty-schools.com, 1 beauty-stories.tk, 1 beauty-style.ml, 1 @@ -19924,7 +19897,7 @@ benjaminpiquet.fr, 0 benjaminprevot.fr, 1 benjaminrancourt.ca, 1 benjaminvasel.de, 1 -benjamorphism.com, 1 +benjamorphism.com, 0 benjii.me, 1 benjijaldoner.nl, 1 benjilopez.com, 1 @@ -20330,6 +20303,7 @@ bestboot.cf, 1 bestbox.be, 1 bestbrakes.com, 0 bestbudseedbank.com, 1 +bestbureau.fr, 1 bestbuyzone.com, 1 bestcamshow.tk, 1 bestcanvaswallart.com, 1 @@ -20833,7 +20807,7 @@ betseybuckheit.com, 1 betsfortoday.com, 1 betshoot.com, 1 betsonlinefree.com.au, 1 -betspin.com, 1 +betspin.com, 0 betsquare.com, 1 betstop.gov.au, 1 bett1.at, 1 @@ -20894,7 +20868,6 @@ bettingmalaysia.online, 1 bettingonaverage.com, 1 bettingphilippines.online, 1 bettolinokitchen.com, 0 -betty-baloo.com, 1 bettyblue.tk, 1 bettysseafoodshack.com, 1 betulashop.ch, 1 @@ -20917,6 +20890,7 @@ betwinner1.com, 1 betwinner2.com, 1 betwinner5.mobi, 1 betwinnerkenya.com, 1 +betwinnermobileapp.com, 1 betwinnernigeria.com, 1 betwinnerperu.com, 1 betwinnerportugal.com, 1 @@ -21209,7 +21183,6 @@ bibitec.de, 1 bible-maroc.com, 1 bible4u.net, 1 biblebrainhealth.com, 1 -bibleflare.com, 1 bibleforchildren.ru, 1 biblegen.com, 1 bibleinsiderest.ga, 1 @@ -22003,7 +21976,7 @@ birnenhain.de, 1 birobidjan.tk, 1 birobidzhan-news.net, 1 birone.tk, 1 -bironthemes.com, 1 +bironthemes.com, 0 birosuli.hu, 1 birouldeimagine.ro, 1 birow.com, 1 @@ -22066,7 +22039,6 @@ bisrockonline.tk, 1 biss-hcai.ca, 1 bissalama.org, 1 bisschopssteeg.nl, 1 -bissingen.de, 1 bissokush.cf, 1 bistro-dengi.ml, 1 bistrodeminas.com, 1 @@ -22519,6 +22491,7 @@ bkin-42740.xyz, 1 bkin-43450.xyz, 1 bkin-46680.xyz, 1 bkk24.de, 1 +bkkf.at, 1 bkkposn.com, 1 bklaindia.com, 1 bkli.me, 1 @@ -22570,7 +22543,6 @@ black-friday.org.il, 1 black-ghost.tk, 1 black-goldautokozmetika.hu, 1 black-hair-extension.tk, 1 -black-holes.org, 1 black-magic-love-spells.com, 1 black-mail.nl, 1 black-market.ga, 1 @@ -22752,7 +22724,6 @@ blago-sostoyanie.ml, 1 blago.tk, 1 blagomed.by, 1 blagosvet.ml, 1 -blagovoniya-top.ru, 1 blague.tk, 1 blahaj.pl, 1 blaindalefarms.com, 1 @@ -22770,6 +22741,7 @@ blakezone.com, 1 blako-squad.tk, 1 blakylle.de, 1 blan.tk, 1 +blana.ro, 1 blanboom.org, 1 blancamartinez.com, 1 blanchardandcalhoun.com, 1 @@ -22828,6 +22800,7 @@ blauwegeit.nl, 1 blauwereigercoaching.nl, 1 blauwgras.nl, 1 blavandbike.de, 1 +blavandbike.dk, 1 blavaty.tk, 1 blayne.me, 0 blayneallan.com, 1 @@ -23366,7 +23339,6 @@ bmak.me, 1 bmak.xyz, 1 bmbfiltration.com, 1 bmblawfirm.com, 1 -bmbsender.uk, 1 bmdonline.eu, 1 bme.com, 1 bmelecevolution.com, 1 @@ -24183,7 +24155,6 @@ bostonaquariumsociety.org, 1 bostonbeer.com, 0 bostonchamber.com, 1 bostonews.tk, 1 -bostonfast.com, 1 bostonheartdiagnostics.com, 1 bostonmedicalgroup.com, 1 bostonrealestateinvestorsassociation.com, 1 @@ -24954,7 +24925,7 @@ bretcarmichael.com, 1 breteuilcommerceartisanat.com, 1 breton.pm, 1 bretonhouse.ca, 1 -bretonstripe.com, 1 +bretonstripe.com, 0 brettcornwall.com, 1 bretti.net, 1 brettlawyer.com, 0 @@ -25050,7 +25021,6 @@ bridesforacause.com, 1 bridestarco.com, 1 bridge-online.cloud, 1 bridge-to-knowledge.nl, 1 -bridge-xs.com, 1 bridge.casa, 1 bridge.nl, 1 bridgecitytx.gov, 1 @@ -25341,7 +25311,6 @@ brokgency.com, 1 brol.eu, 1 brollopsfotografkalmar.com, 1 bromcomvle.com, 1 -bromen.id, 1 bromfietsman.tk, 1 bromideas.ga, 1 bromo.com, 1 @@ -25992,6 +25961,7 @@ builtinaustin.com, 1 builtinboston.com, 1 builtinchicago.org, 1 builtincolorado.com, 1 +builtingym.com, 1 builtinla.com, 1 builtinnyc.com, 1 builtinseattle.com, 1 @@ -26273,7 +26243,6 @@ bursagan.com.co, 1 bursamusik.tk, 1 bursapartner.tk, 1 bursapay.com, 1 -burst-statistics.com, 1 burstequity.com, 1 burstequity.net, 1 burstequity.org, 1 @@ -26557,6 +26526,7 @@ businessscapes.ga, 1 businesssend.ga, 1 businessshoot.ga, 1 businessslide.ga, 1 +businesssolutionsprofits.com, 0 businesssonic.ga, 1 businesssouthbeach.ga, 1 businesssparkle.ga, 1 @@ -26664,7 +26634,6 @@ butsa.tk, 1 butserdocumentary.tk, 1 buttedesmortssd1wi.gov, 1 butter.horse, 1 -butterchat.io, 1 butterflytigress.com, 1 butterhost.ga, 1 buttermilk.cf, 1 @@ -27459,7 +27428,6 @@ cakedeveloperers.ga, 1 cakedeveloperest.ga, 1 cakejournal.com, 1 cakelaces.com, 1 -cakenetwork.com, 1 cakeoffencesact.uk, 1 cakes.ga, 1 cakes.tk, 1 @@ -28386,7 +28354,6 @@ carboncountypa.gov, 1 carboncountywy.gov, 1 carbondaleil.gov, 1 carboneventsupport.lu, 1 -carbonkiller.org, 1 carbonlib.com, 0 carbonmapper.org, 1 carbonnel.me, 0 @@ -28472,7 +28439,6 @@ cardozovargas.xyz, 1 cardpresso.com, 1 cardprinter.co.il, 1 cardpyramiders.ga, 1 -cardranking.jp, 1 cardrecovery.fr, 1 cards4jobs.com, 1 cardschat.com, 1 @@ -28536,7 +28502,6 @@ carespot.com, 1 carespottravelmedicine.mobi, 1 carestartantigen.com.au, 1 caret.be, 1 -caretaker.com, 1 caretogether.coop, 1 carevic.eu, 1 carey.cl, 1 @@ -28893,7 +28858,6 @@ cartucce24.it, 1 cartuchoonline.com.br, 1 cartunings.tk, 1 carty.bg, 1 -carun.us, 0 carunion.nl, 1 carus.com, 1 caruso.com, 1 @@ -28998,6 +28962,7 @@ cascadinglounge.tk, 1 cascavelle.fr, 1 cascavelle.nl, 1 casden.fr, 1 +case-jucu.ro, 1 case-la-rosu.ro, 1 case-vacanza-salento.com, 1 case-ware.info, 1 @@ -29221,7 +29186,6 @@ casinocrit.com, 1 casinodebeaulieu.com, 1 casinodecavalaire.com, 1 casinofollower.com, 1 -casinoleader.com, 1 casinolistings.com, 1 casinologin.pl, 1 casinologinaustralia.com, 1 @@ -29382,6 +29346,7 @@ catalonia.tk, 1 catalyseurs-territoriaux.org, 1 catalyst-ecommerce.com, 1 catalystapp.co, 1 +catalystindustrialservices.com, 1 catalyzr.info, 1 catandmoonalchemy.com.au, 1 cataniatoday.it, 1 @@ -29456,7 +29421,6 @@ catholicgallery.org, 1 catholicjobs.com, 1 catholicnewstt.com, 1 catholicprayers.tk, 1 -catholicprayerspace.ca, 1 catholicteuchtar.cf, 1 catholicteuchtar.ga, 1 catholicteuchtar.ml, 1 @@ -29543,6 +29507,7 @@ cauquenes.tk, 1 cautela.io, 1 cautela.us, 1 cautron.com, 1 +cavac.at, 1 cavalassur.com, 1 cavaleirocity.com.br, 1 cavalier-reporting.com, 1 @@ -29564,7 +29529,6 @@ cavsconnect.com, 1 cavzodiaco.com.br, 1 caw.be, 1 cawagiras.ga, 1 -cawsandbayguitarfest.co.uk, 1 caycehouse.com, 1 caylercapital.com, 1 caymanchem.com, 0 @@ -30248,7 +30212,6 @@ cerovica.tk, 1 cerpus-course.com, 1 cerqa.cloud, 1 cerquitamio.com, 1 -cerrad.com.ua, 1 cerrajeriaamericadelquindio.com, 1 cerrajeriaenvillavicencio.com, 1 cerritosca.gov, 1 @@ -30483,6 +30446,7 @@ cgsmart.com, 1 cgsmotors.com, 1 cgstprayagraj.gov.in, 1 cgt-univ-nantes.fr, 1 +cgtburgos.org, 1 cgtcaixabank.es, 1 cgtsoft.com, 1 cgtv.ml, 1 @@ -31207,7 +31171,6 @@ chernigovnews.ru, 1 chernikova.tk, 1 chernogoriya.tk, 1 chernovcy-news.ru, 1 -chernyak.id.au, 1 cherokeecountyga.gov, 1 cherrett.digital, 0 cherry-green.ch, 1 @@ -31240,7 +31203,6 @@ chesswiki.org, 1 chester-law.com, 1 chesterbennington.tk, 1 chestercountysc.gov, 1 -chesterfieldmayfair.com, 1 chesterultimatefrisbee.tk, 1 chestnut.cf, 1 chetin-orlov.ga, 1 @@ -32309,6 +32271,7 @@ citafogasa.es, 1 citafun.tk, 1 citagenix.com, 1 citakon.cz, 1 +citalid.com, 1 citalopram-20-mg.ml, 1 citalopram20.ga, 1 citalopramgeneric.ga, 1 @@ -32356,7 +32319,6 @@ city-adm.lviv.ua, 1 city-glas.com, 1 city-home.tk, 1 city-journal.org, 1 -city-nn.com, 1 city-online.tk, 1 city-walks.info, 1 city.kharkov.ua, 1 @@ -32560,7 +32522,6 @@ citywalkr.com, 1 citywidealarms.com, 1 citywidechimneysweephouston.com, 1 citywindsor.ca, 1 -citywinecellar.com, 1 citywisdom.tk, 1 cityworksonline.com, 1 ciubotaru.tk, 1 @@ -33427,6 +33388,7 @@ cloudfudge.com, 1 cloudgray.com.au, 1 cloudhero.ai, 1 cloudia.org, 1 +cloudigy.es, 1 cloudily.com, 1 cloudimprovedtest.com, 1 cloudindex.io, 1 @@ -33435,6 +33397,7 @@ cloudix.cf, 1 cloudlandmark.com, 1 cloudlessdreams.com, 0 cloudlight.biz, 1 +cloudlucida.com, 1 cloudmachine.fr, 1 cloudmanagedbuilding.com, 1 cloudmanagedbuildings.com, 1 @@ -33883,6 +33846,7 @@ cobb-ranch.com, 0 cobbcountygeorgia.ml, 1 coberturaplus.com, 1 cobiz.nl, 1 +cobolotobolo.com, 1 coboo.nl, 1 coboxviagens.com.br, 1 cobracastles.co.uk, 1 @@ -34001,6 +33965,7 @@ codeclub.gq, 1 codecnetworks.com, 1 codecolliders.com, 1 codecommunity.io, 1 +codeconnect.ir, 1 codecool.com, 0 codecreate.co.uk, 1 codecrew.us, 1 @@ -34478,7 +34443,6 @@ collinlove.se, 1 collinlove.uk, 1 collinlove.us, 1 collinlove.xyz, 1 -collinmbarrett.com, 1 collins.kg, 1 collins4mayor.co.nz, 1 collins4mayor.nz, 1 @@ -34827,6 +34791,7 @@ communitybankliberal.com, 1 communitycollegereview.com, 1 communitycreditunion.com, 1 communitydirectory.tk, 1 +communityeducators.net, 1 communitylivingalgoma.org, 1 communitymalls.com.ph, 1 communitymalls.ph, 1 @@ -35461,6 +35426,7 @@ consul-novocherkassk.ml, 1 consul.io, 0 consuldat.com, 1 consulenteambientale.it, 1 +consulentedellavoro.it, 1 consulenza.pro, 1 consulimp.com.br, 1 consult-altius.co.uk, 1 @@ -36039,6 +36005,7 @@ correo.si, 1 correotemporal.org, 1 correspond.gq, 1 correspondent.ga, 1 +corretoramichelesalvino.com.br, 1 corride.at, 1 corridorsands.com.au, 1 corriere.roma.it, 1 @@ -36318,10 +36285,8 @@ courselore.org, 1 coursemology.sg, 1 courseorbit.com, 1 coursera.org, 1 -coursesanswer.com, 1 coursesidekick.com, 1 courseware.nl, 1 -courseworkbank.info, 1 coursingweb.tk, 1 courstoujours.be, 1 court-colman-manor.com, 1 @@ -36432,7 +36397,7 @@ cowleysexeter.co.uk, 1 cowlitzwa.gov, 1 coworkanywhere.ch, 1 coworked.ai, 1 -coworking-luzern.ch, 1 +coworking-luzern.ch, 0 coworking-space.tk, 1 coxcapitalmanagement.com, 1 coxhealthfoundation.com, 1 @@ -36866,6 +36831,7 @@ creature.social, 1 creayes.com, 1 crebita.de, 1 creche-noel.com, 1 +crechepequenopolegar.com.br, 1 crecips.com, 1 crecman.fr, 1 crecycle.eco, 1 @@ -36889,6 +36855,7 @@ creditcheckup.com, 1 creditcorponline.com, 1 creditenonstop.ro, 1 crediteurope.ru, 1 +creditfair.in, 1 credithuman.com, 1 creditif.tk, 1 creditkarma.ca, 1 @@ -37260,7 +37227,6 @@ crowdbox.net, 1 crowdcloud.be, 1 crowdee.com, 1 crowdfiber.com, 1 -crowdfundingdream.com, 1 crowdpress.it, 1 crowdsim3d.com, 1 crowdstack.com, 1 @@ -37384,7 +37350,6 @@ crypticstench.tk, 1 cryptifo.com, 1 cryptii.com, 0 cryptin-it.com, 1 -cryptitan.live, 1 cryptme.in, 1 crypto-ads.ga, 1 crypto-clix.xyz, 1 @@ -38028,6 +37993,7 @@ cursomente.online, 1 cursorcam.tk, 1 cursos-trabajadores.net, 1 cursos.com, 1 +cursos.enf.br, 1 cursosbajoprecio.com, 1 cursosdepestanas.com, 1 cursosemmaus.es, 1 @@ -38441,6 +38407,7 @@ cybersins.com, 1 cyberskyline.com, 1 cybersmart.co.uk, 1 cybersolution.tk, 1 +cybersolve.com, 1 cybersoulz.com, 1 cybersound.tk, 1 cyberspect.io, 1 @@ -38568,7 +38535,6 @@ cytat.tk, 1 cytegic-update-packages.com, 1 cytobank.org, 1 cytosorbents.com, 1 -cytovet.ru, 1 cyvault.io, 1 cz.ma, 1 cz.nl, 1 @@ -38655,7 +38621,6 @@ d25vkjbt1xiu01.cloudfront.net, 1 d25x5pqe2jwu0a.cloudfront.net, 1 d2evs.net, 1 d2i06m35fc7thi.cloudfront.net, 1 -d2ph.com, 1 d2trade.tk, 1 d2woj1dt0tk6sn.cloudfront.net, 1 d36533.com, 1 @@ -38866,6 +38831,7 @@ dailydoze.com, 1 dailyeasternnews.com, 1 dailyegyptian.com, 1 dailyfictive.com, 1 +dailyfish.ru, 1 dailyforex.com, 1 dailyfx.com, 1 dailyhealthylife.ml, 1 @@ -38875,7 +38841,6 @@ dailyillini.com, 1 dailyjigsawpuzzles.net, 1 dailykos.com, 1 dailykosbeta.com, 1 -dailyletter.tv, 1 dailylime.kr, 1 dailylviv.com, 1 dailymedicalinfo.com, 1 @@ -38950,6 +38915,7 @@ dalbitresb.com, 1 daldropsbb.com, 1 daleanddollops.com, 1 dalecountyal.gov, 1 +daleunavueltaalmundo.com, 1 dalevuelta.tk, 1 dalfsennet.nl, 1 dali-boli.me, 1 @@ -39281,6 +39247,7 @@ danotage.tv, 1 danovamix.com.br, 1 danparkercarpentry.com, 1 danpiel.net, 1 +danpol.co.uk, 1 danq.me, 1 danramer.tk, 1 dansage.co, 0 @@ -39651,6 +39618,7 @@ datadyne.technology, 1 dataentry.top, 1 datafactory.co.za, 1 datafinland.com, 1 +datafloq.com, 1 datagir.ir, 0 datagrail.io, 1 datagrid.ga, 1 @@ -39685,6 +39653,7 @@ dataprisma.com.br, 1 dataprivacyframework.gov, 1 dataprivacysolution.com, 1 dataproject.com, 1 +dataprowess.com.au, 1 datapun.ch, 1 datarails.com, 1 dataregister.info, 1 @@ -40394,6 +40363,7 @@ dearktiel.nl, 1 deasserstadsloop.nl, 1 deasy-store.com, 1 death-notices.co.uk, 1 +death.ceo, 1 death.social, 1 deathberry.ddns.net, 1 deathbits.com, 1 @@ -40449,6 +40419,7 @@ debian-hell.org, 1 debian.link, 1 debianizzati.org, 1 debigare.com, 1 +debipay.co.za, 1 debita.fi, 1 debita.org, 1 debitterballetjes.tk, 1 @@ -40509,7 +40480,6 @@ decaturcountytn.gov, 1 decaturian.com, 1 decaturish.com, 0 deccanvalue.com, 1 -deceasedonline.com, 1 decentrala.org, 1 dechat.nl, 1 decherdtn.gov, 1 @@ -40758,6 +40728,7 @@ degreeducation.tk, 1 degreeverify.com, 1 degreeverify.net, 1 degreeverify.org, 1 +degressif.com, 1 degroetenvanrosaline.nl, 1 degrootenslot.nl, 0 degroupnews.com, 1 @@ -40887,6 +40858,7 @@ delhicleanairforum.tk, 1 delhitourism.gov.in, 1 delhitownshipmi.gov, 1 deli-fuzoku.jp, 1 +deliacreates.com, 1 deliandiver.org, 1 deliberatelyclassy.com, 1 delicaclubphils.tk, 1 @@ -41140,6 +41112,7 @@ denhotels.com, 1 deniani.com, 1 denied.gr, 1 denieuwenederlandsevlag.tk, 1 +denikoo.co, 1 deniky.cz, 1 denimology.com, 1 denimtoday.com, 1 @@ -41330,6 +41303,7 @@ depo12.com, 1 depoalabama.com, 1 depokcity.tk, 1 depolab.com, 1 +depolauncher.cf, 1 depone.net, 0 depoondemand.com, 1 depoone.com, 1 @@ -41639,7 +41613,6 @@ desstrade.com, 1 dest-gottskar-nidingen.se, 1 destcyr.com, 1 destech.nl, 1 -desteconsilium.be, 1 desteniiprocess.com, 1 destentor.nl, 1 desterman.ru, 1 @@ -42096,6 +42069,7 @@ dgtl.hosting, 1 dgtl.tools, 1 dgtl.work, 1 dgund.com, 1 +dh-etechnik.de, 1 dh-leasing.si, 1 dh.si, 1 dh26a.com, 0 @@ -42143,6 +42117,7 @@ dhxxls.com, 1 di2pra.com, 0 di2pra.fr, 0 dia-de.com, 1 +dia-te.ch, 1 dia.com.br, 1 diaakademi.com, 1 diabetes-te.ch, 1 @@ -42441,7 +42416,6 @@ diesse.nl, 0 dieste.com, 1 dieta-figura.tk, 1 dietandexercises.tk, 1 -dietanic.co, 1 dietaryguidelines.gov, 1 dietbrand.eu, 1 dieter.one, 1 @@ -42461,7 +42435,7 @@ dietmoikiensinh.tk, 1 dietolog.gq, 1 dietpi.com, 1 dietrich-bonhoeffer.net, 1 -dietrich.cx, 1 +dietrich.cx, 0 dieumfrage.com, 1 dievozodis.lt, 1 dievturi.lv, 1 @@ -42766,7 +42740,6 @@ digitypa.fi, 1 digivan.ml, 1 digivibe.cz, 1 digiwedoo.com.au, 1 -digiyatrafoundation.com, 1 diglloyd.com, 1 digminecraft.com, 1 dignilog.com, 1 @@ -42916,6 +42889,7 @@ dinos-mag.tk, 1 dinotv.at, 1 dintrafic.net, 1 diobrasperu.com, 1 +diocesedeosorio.org, 1 diodo.me, 1 dioesfoto.com, 1 diogbatech.tk, 1 @@ -43340,6 +43314,7 @@ districtcourtislamabad.tk, 1 distrigenosa.tk, 1 distrikia.com.co, 0 distrilogservices.com, 1 +distrito10.cl, 1 distritoae.com, 1 distritotres.tk, 1 distritoxic.tk, 1 @@ -43395,7 +43370,6 @@ diversify.ga, 1 diversity-otherwise.tk, 1 diversityflags.com.au, 1 diversityflags.nz, 1 -diversitywatch.asia, 0 diversitywatch.co.nz, 1 diversovariable.tk, 1 diversual.com, 1 @@ -44131,6 +44105,7 @@ doctour.eu, 1 doctour.fr, 1 doctrine.fr, 1 doctyapp.com, 1 +docu-tools.com, 1 docu.io, 1 docubox.info, 1 docugate.cloud, 1 @@ -44383,6 +44358,7 @@ domacizoo.cz, 1 domadillo.com, 1 domagovic.tk, 1 domain-comparison.com, 1 +domain-privacy.org, 1 domain-skachat.cf, 1 domain-speicher.com, 0 domain-swiss.ch, 1 @@ -44774,7 +44750,7 @@ dorier-digiplace.com, 1 doritadata.com, 1 dorizonline.tk, 1 dorkface.tk, 1 -dorm.social, 0 +dorm.social, 1 dormi.hu, 1 dormilaine.fr, 1 dorminyeremenyjatek.hu, 1 @@ -44899,6 +44875,7 @@ douai.me, 1 douari.info, 1 douari.jp, 1 douari.net, 1 +douari.xxx, 1 douban.city, 1 double20.gg, 1 doublearm.in, 1 @@ -45259,6 +45236,7 @@ drapeauxdespays.fr, 1 draper.wtf, 1 draperutah.gov, 1 drapetra.com.br, 1 +drardiving.com, 1 drardivingcenter.com, 1 dras.hu, 1 drasocalzado.com, 1 @@ -45642,7 +45620,6 @@ droneup.pl, 1 droneways.tech, 1 dronix.tk, 1 dronografia.es, 0 -droom.in, 1 droomhuis-in-zuid-holland-kopen.nl, 1 drop-zone.tk, 1 drop.com, 1 @@ -45942,12 +45919,14 @@ dualuniverse.game, 1 duama.top, 1 duanemorrisinstitute.com, 1 duanre.tk, 1 +duanything.com, 1 duarteeleiteconsultoria.com.br, 1 dubachinn.com, 1 dubai-realestate.space, 1 dubaiaward.link, 1 dubaibliss.com, 1 dubaifitnesschallenge.com, 1 +dubaigrandsale.com, 1 dubailuxuryinvestors.com, 1 dubaimonsters.com, 1 dubaipremiuminvest.com, 1 @@ -46285,7 +46264,6 @@ duv.al, 1 duval.info, 1 duval.li, 1 duval.ovh, 1 -duval.paris, 1 duval.pm, 1 duval.re, 1 duvalelections.gov, 1 @@ -46447,11 +46425,11 @@ dynamicenergy.co, 1 dynamicengine.com, 1 dynamicfireworks.co.uk, 1 dynamicini.org, 1 -dynamiclogodesigns.com, 1 dynamicnet.net, 1 dynamicpl.us, 1 dynamicplus.it, 1 dynamicquantum.net, 1 +dynamicroofingconcepts.com, 1 dynamicsandlearning.com, 1 dynamicsdays.info, 1 dynamicservers.co.uk, 1 @@ -46847,7 +46825,6 @@ eaglehaslended.com, 1 eaglelakefl.gov, 1 eagleled.us, 1 eaglemoe.com, 1 -eaglemtn.com, 0 eaglenusa.my.id, 1 eaglepasstx.gov, 1 eagleplanners.agency, 1 @@ -47127,6 +47104,7 @@ easysoft.tk, 1 easysolution.eu, 1 easyspace-storage.com, 1 easysubmit.tk, 1 +easyswap.me, 1 easytamil.tk, 1 easytec-info.de, 1 easytestonline.tk, 1 @@ -47257,7 +47235,6 @@ ebizarts.com, 1 ebjork.se, 1 ebki-nsn.gov, 1 eblan.gq, 1 -eblandscaping.com.au, 1 eblesoft.org, 1 eblog.cf, 1 eblog.ink, 0 @@ -47479,7 +47456,6 @@ ecohaus-pinklao-salaya.com, 0 ecoheatcool.co.uk, 1 ecohimdv.tk, 1 ecohostingservices.uk, 1 -ecohustler.com, 1 ecoindia.tk, 1 ecojob.ga, 1 ecolala.my, 1 @@ -47525,6 +47501,7 @@ ecommercenews.com.au, 1 ecommercenews.in, 1 ecommercenews.uk, 1 ecommerceuropa.eu, 1 +ecomovers.com, 1 ecompen.co.za, 1 ecomsight.com, 0 ecomuuu.com, 1 @@ -47923,6 +47900,7 @@ edumaritime.net, 1 edumedcourses.com, 1 edumerson.com, 1 edumint.lt, 1 +edumontclasses.com, 1 edunaut.com.au, 1 edunet.gq, 1 edunian.com, 1 @@ -48016,7 +47994,6 @@ een.com, 1 eenfotowaard.nl, 1 eenmailsturen.nl, 0 eentweevijf.be, 1 -eenvren.com, 1 eenvxing.com, 1 eenzwolle.nl, 1 eeqj.com, 1 @@ -48645,6 +48622,7 @@ eldisagjapi.de, 1 eldorado.aero, 1 eldoradocylinders.com, 1 eldoradoil.gov, 1 +eldoradoinsiders.com, 0 eldoradotechnical.com, 1 eldrid.ge, 1 ele-sm.com, 1 @@ -49812,6 +49790,7 @@ enbyn.de, 1 encanroy.ca, 1 encanroy.com, 1 encanstanne.ca, 1 +encantowater.com, 0 encd.life, 1 ence.es, 1 encenna.com.br, 0 @@ -49908,6 +49887,7 @@ endrust.com.au, 1 endsoftpatents.org, 1 endsoftwarepatents.org, 1 endspamwith.us, 1 +endstation-chaos.de, 1 enduranceseries.ca, 1 enduro-center.pt, 1 enduroxtrem.tk, 1 @@ -50234,7 +50214,6 @@ enprobe.io, 1 enputu.tk, 1 enqrypted.net, 1 enquetebeteiligung.de, 1 -enquirebio.com, 1 enquos.com, 1 enrack.tk, 1 enrak.fi, 1 @@ -50291,7 +50270,6 @@ entasyonline.com, 1 entbastel.de, 1 entdeckertouren.com, 1 enteente.com, 1 -entegrations.io, 1 entelodont-laboratory.cz, 1 ententaxi.de, 1 enter.co, 1 @@ -50482,7 +50460,7 @@ eoceanic.com, 1 eod.su, 1 eofster.com, 1 eogresources.com, 1 -eohima.org, 0 +eohima.org, 1 eol-team.tk, 1 eola.co, 1 eolasinnovation.com, 1 @@ -50606,7 +50584,6 @@ epnuffic.nl, 0 epobocka.com, 1 epoch-film.ml, 1 epochcg.pt, 1 -epochconcepts.com, 0 epochstream.com, 1 epolitiker.com, 1 epos.az, 1 @@ -51262,7 +51239,6 @@ esploria.com, 1 espocada.com, 1 espoonkumi.fi, 0 esport-agency.fr, 1 -esporte.casino, 1 esporters.today, 1 esportsbattles.ga, 1 espower.com.sg, 1 @@ -51533,7 +51509,6 @@ ethan.pm, 1 ethanjones.me, 1 ethanlew.is, 1 ethanopp.com, 0 -ethanq.ca, 1 ethanrjones.name, 1 ethansailant.com, 1 ethanyoo.com, 1 @@ -51746,7 +51721,6 @@ euro17promotora.com.br, 1 euroasia-tm.com, 1 eurobahn.de, 1 eurobattle.tk, 1 -eurobeaute.be, 1 eurobilltracker.tk, 1 eurocarparks.ie, 1 eurocertificazione.it, 1 @@ -51829,7 +51803,7 @@ europeanpreppers.com, 1 europeanspring.net, 1 europeanstudies-chemnitz.de, 1 europeantransmissions.com, 1 -europedigital.cloud, 1 +europeantransportmanagement.com, 1 europeluxuryweddings.com, 1 europeonline.tk, 1 europeontrack.org, 1 @@ -52613,6 +52587,7 @@ explicamente.pt, 1 explode.tk, 1 explodie.org, 1 explohub.com, 1 +exploit-db.com, 1 exploit.cz, 0 exploit.party, 1 exploited.cz, 1 @@ -52894,6 +52869,7 @@ ezinternet.com.au, 1 ezitech.com, 1 ezloans4realestate.com, 1 ezlogi.jp, 1 +ezlogzblog.com, 1 ezmedix.ua, 1 ezmob.com, 1 ezmoddingz.tk, 1 @@ -53246,6 +53222,7 @@ faelif.loseyourip.com, 1 faelix.ch, 1 faelix.eu, 1 faelix.fr, 1 +faelix.im, 1 faelix.net, 1 faelix.uk, 1 faelmanager.it, 1 @@ -53410,7 +53387,6 @@ falce.in, 1 falcema.com, 1 falchion.tk, 1 falck.dk, 1 -falcn.io, 1 falcom.co.jp, 1 falcom.shop, 1 falcon.io, 1 @@ -54054,7 +54030,6 @@ favoritestudenters.ga, 1 favoritestudentest.ga, 1 favoritetechers.ga, 1 favouritequotations.ca, 1 -favourperfect.com.au, 0 favro.com, 1 favrotest.com, 1 faw-club.cf, 1 @@ -54443,7 +54418,6 @@ felixturgeon.ca, 1 felixvelarde.com, 0 felixweb.tk, 1 feliz.tk, 1 -fellas.com.tr, 1 felly.com.br, 1 felonymath.com, 1 felonymath.net, 1 @@ -55044,7 +55018,7 @@ filejo.com, 1 filek.ga, 1 fileplanet.com, 1 fileport.io, 1 -filequit.xyz, 1 +filequit.xyz, 0 files.com, 0 files.to, 1 files4share.com, 1 @@ -55863,6 +55837,7 @@ flabacinov.ga, 1 flabutelov.tk, 1 flacandmp3.ml, 1 flacon.tk, 1 +flacsoandes.edu.ec, 1 fladnag.net, 1 flaeskeklubben.dk, 1 flaeskeklubben.eu, 1 @@ -55899,6 +55874,7 @@ flam.lu, 1 flam.studio, 1 flaman-h7a.fr, 1 flamanville.fr, 1 +flameflyff.com, 0 flamehaze.tk, 1 flamellugano.com, 1 flamencoexplained.com, 0 @@ -57403,7 +57379,6 @@ fotobrb.de, 1 fotobringer.de, 1 fotobrinke.de, 1 fotochip.tk, 1 -fotocoach.pl, 1 fotocopiatrici.roma.it, 1 fotofaerie.net, 1 fotofast.tk, 1 @@ -57428,11 +57403,9 @@ fotolectura.tk, 1 fotoleitner.com, 1 fotoleitner.de, 1 fotoloji.art, 1 -fotoloji.net, 1 fotomatonweb.es, 1 fotomodel.cf, 1 fotomodels.tk, 1 -fotonbolivia.com.bo, 1 fotonippon.com, 1 fotontechnik.pl, 1 fotonza.ru, 1 @@ -57606,7 +57579,6 @@ fptbb.com, 1 fptsoftware.com, 1 fpu.sk, 1 fpy.cz, 1 -fqcstandard.com.tr, 1 fr-fotopage.tk, 1 fr.search.yahoo.com, 0 fr33tux.org, 1 @@ -57701,12 +57673,11 @@ framboise314.fr, 1 framedog.tk, 1 framegame.ch, 1 framemo.org, 1 -framenails.fr, 1 framer.ai, 1 framer.com, 1 framer.live, 1 framer.studio, 1 -framer.website, 0 +framer.website, 1 framerjs.com, 1 framesdirect.com, 1 framesi.cz, 1 @@ -57771,7 +57742,6 @@ francoexpeditionperu.com, 1 francofunghi.tk, 1 francois-occasions.be, 1 francoiscarrier.com, 1 -francoise-janssens.be, 1 francoise-paviot.com, 1 francoisharvey.ca, 1 francoislaude.fr, 1 @@ -58107,7 +58077,6 @@ freedomwill.tk, 1 freedomworldoutreach.com, 1 freeebooksblog.com, 1 freeenglishhelp.com, 1 -freeexampapers.com, 1 freefallproductions.tk, 1 freefemale.com, 1 freefilesync.org, 1 @@ -58934,7 +58903,6 @@ fulgaz.com, 0 fulgentoncology.com, 1 fulisex.com, 1 fuliwang.info, 1 -full-hd.info, 1 full-service-suite.com, 1 full-stack.ninja, 1 full.eu.org, 1 @@ -59598,7 +59566,6 @@ g9297.co, 1 g9728.co, 1 g9kingnine.xyz, 1 ga-digitazion.com, 1 -ga-part.ru, 1 ga.fr, 1 ga4wp.com, 1 gaaog.com, 1 @@ -59917,7 +59884,6 @@ game-gentle.com, 1 game-net.ml, 1 game-repack.site, 1 game.es, 1 -game.gal, 0 game4less.com, 1 game818play.com, 1 game88play.com, 1 @@ -60315,7 +60281,6 @@ gasbarkenora.com, 1 gasenergy.kz, 1 gasesdelaguajira.com, 1 gasfitermaipu.cl, 1 -gasgipfel.de, 1 gasherde.tk, 1 gashtline.ir, 1 gasigasy.mg, 1 @@ -60373,7 +60338,6 @@ gatemaster.ga, 1 gatemotorskyalami.co.za, 1 gatemoves.com, 1 gatenz-panel.com, 0 -gates-of-olympus-app.com, 1 gatesfoundation.org, 1 gatesmri.org, 1 gatesphilanthropypartners.org, 1 @@ -60445,7 +60409,6 @@ gayfr.live, 1 gayfr.online, 1 gayfr.social, 1 gayga.gov, 1 -gaygay.pro, 1 gaygeeks.de, 1 gayhotmovies.com, 1 gaylaktika.com, 1 @@ -60836,13 +60799,11 @@ gemmy.cf, 1 gemonite.com, 1 gemooi.com, 1 gemquery.com, 1 -gemsen.com, 1 gemstones.com, 1 gemwerx.com, 1 gen.cn.eu.org, 1 gen.net.eu.org, 1 gen3marketing.com, 1 -gen53.org, 1 genbars.jp, 1 genbrugge.tk, 1 genchev.io, 0 @@ -61272,7 +61233,7 @@ gerber-construction.com, 1 gerbil.tk, 1 gerbils.tk, 1 gerbyte.uk, 1 -gerd-frank.com, 1 +gerd-frank.com, 0 gerda.nl, 1 gereedschapmuseumdehobbyzolder.tk, 1 gerenciaconsultor.com, 1 @@ -61437,7 +61398,6 @@ geteducation.tk, 1 geteduroam.no, 1 getelectronics.tk, 1 getescrowest.ga, 1 -getestudio.com, 1 getevidenceers.ga, 1 getfastanswer.com, 1 getfedora.org, 1 @@ -62196,7 +62156,6 @@ gizlicekim.tk, 1 gizmo.ovh, 1 gizmodo.com, 1 gizmodo.in, 1 -gizmosforgeeks.com, 1 gj-bochum.de, 1 gj-cham.tk, 1 gjan.in, 1 @@ -62723,7 +62682,6 @@ gncbilgi.com, 1 gnd.sk, 1 gndforeurope.com, 1 gnezdo.tk, 1 -gnfb.be, 1 gnfrazier.me, 1 gnhub.org, 1 gnida.tk, 1 @@ -63024,7 +62982,6 @@ goldeninvestmentbarcelona.com, 1 goldenkeys.io, 1 goldenmunchbakeshop.com, 1 goldenoaksgolfclub.com, 1 -goldenpi.com, 1 goldenplate.com.sg, 1 goldenpreference.com, 1 goldenravengifts.com, 1 @@ -63403,7 +63360,6 @@ gosch.de, 1 gosekku.com, 1 gosemo.com, 1 goshawkdb.io, 1 -goshen.network, 1 goshiba.pl, 1 goshin-group.co.jp, 1 goshippingcargo.com, 1 @@ -63982,7 +63938,6 @@ gravitational.io, 1 gravitechthai.com, 1 gravitlauncher.ml, 1 graviton.work, 1 -gravity-bonanza.org, 1 gravity-inc.net, 1 gravityformspdfextended.com, 1 gravityinvestments.com, 1 @@ -64345,7 +64300,6 @@ greymouthkiwi.co.nz, 1 greymuzzlemanor.org, 1 greypanel.com, 1 greyrectangle.com, 1 -greyscale.zone, 1 greyskymedia.com, 1 greysolonballroom.com, 1 greystonesmovement.com, 1 @@ -64418,6 +64372,7 @@ grinday.tk, 1 grindgore.tk, 1 grinmore.com, 1 grinned.tk, 1 +grinnellksroots.com, 1 grinnellplanes.com, 1 grinnellplans.com, 1 grinpis.tk, 1 @@ -64583,7 +64538,6 @@ groveld.com, 1 growatiopex.com, 1 growbydata.com, 1 growbyrabbit.com, 1 -growcredit.com, 1 growebmarketing.com, 0 growery.org, 1 growglam.com, 1 @@ -64667,6 +64621,7 @@ grunwasser.fr, 1 grupatvogzivota.tk, 1 grupcarles.com, 1 grupdedansa.tk, 1 +grupdigital.com, 1 gruphepsi.tk, 1 grupo-famia.tk, 1 grupo-rbd.com, 1 @@ -64939,7 +64894,6 @@ guerrasgalacticas.tk, 1 guerrilla-marketing.cf, 1 guerrillaradio.tk, 1 guerrillas.tk, 1 -guesanelectronics.com, 1 guesclin.com, 1 guessmatch.com, 1 guestandmore.de, 1 @@ -65455,7 +65409,6 @@ h9728.co, 1 ha-kunamatata.de, 1 ha.com, 1 ha.fo, 1 -ha.tec.br, 1 ha2a.nl.eu.org, 1 ha2hva1n.com, 1 ha3.eu, 1 @@ -65915,7 +65868,6 @@ halyul.com, 1 ham.community, 1 ham.study, 1 hamacho-kyudo.com, 1 -hamali.bg, 1 hamarimarriage.tk, 1 hamartrophy.cf, 1 hamaslul.com, 1 @@ -66040,6 +65992,7 @@ handicappingsportsers.ga, 1 handicappingsportsest.ga, 1 handicapzero.org, 1 handicraftsman.tk, 1 +handigehannie.nl, 1 handinhandhrd.eu, 1 handler.lt, 1 handler.lv, 1 @@ -66927,7 +66880,6 @@ hdrams.com, 1 hdrcomercio.com.br, 1 hdrezka.live, 1 hdrezka2018.tk, 1 -hdrip.info, 1 hdrtranscon.com, 0 hds-lan.de, 1 hdscheduleers.ga, 1 @@ -67708,6 +67660,7 @@ heliosnet.com, 1 heliosvoting.org, 0 heliport-moscow.ru, 1 heliport-parts.ru, 1 +helisimmer.com, 1 helium.computer, 1 heliumtech.tk, 1 heliwing.com, 1 @@ -68087,7 +68040,6 @@ hermes-servizi.it, 1 hermesawards.com, 1 hermesoft.at, 1 hermessenger.fr, 1 -hermetas.org, 1 hermetien.tk, 1 hermietkreeft.site, 0 herminghaus24.de, 1 @@ -68465,7 +68417,6 @@ hifala.de, 1 hiffen.tk, 1 hiffo.de, 1 hifiaudio.sk, 1 -hifiescort.in, 1 hifiphile.com, 0 hifis.net, 1 hifly.aero, 1 @@ -70132,7 +70083,6 @@ hotel-brunico.net, 1 hotel-du-parc-allevard.fr, 1 hotel-fleuralp.it, 1 hotel-garni-letizia.it, 1 -hotel-insectes.be, 1 hotel-jahnatal.de, 1 hotel-kontorhaus.de, 1 hotel-krone.ch, 1 @@ -71662,6 +71612,7 @@ iatrikos-exoplismos.gr, 1 iaudited.com, 1 iav.com, 1 iav.de, 1 +iava.ind.br, 1 iavalley.edu, 1 iawx.net, 1 iaxx.eu, 1 @@ -72086,6 +72037,7 @@ idempiere.org, 1 iden-tt.com, 1 iden-tt.net, 1 iden-tt.org, 1 +idenamaislami.com, 0 idenfit.com, 1 idensys.nl, 1 ident-clinic.be, 1 @@ -72296,7 +72248,6 @@ iftta.org, 1 ifur.ga, 1 ifworlddesignguide.com, 1 ifxnet.com, 1 -ifylofd.xyz, 1 ifyou.bg, 1 ig-plastik.tk, 1 ig.com, 1 @@ -72579,9 +72530,8 @@ ikra24.in.ua, 1 ikrab.club, 1 iks.moe, 1 iksi.me, 1 -iksworld.kr, 1 -iksz.org, 0 -iksz.work, 0 +iksz.org, 1 +iksz.work, 1 ikuda.eu, 1 ikudo.top, 1 ikumi.us, 1 @@ -72594,7 +72544,6 @@ ikzoekeengoedkopeauto.nl, 1 ikzoektim.nl, 1 il12thcourt.gov, 1 ila.tw, 1 -ilab.health, 1 ilac.ai, 1 ilac101.com, 1 ilacrehberi.com, 1 @@ -72752,7 +72701,6 @@ iltze.fr, 1 ilug-ktm.tk, 1 iluman.tk, 1 ilumantio.tk, 1 -ilumina2photo.es, 1 iluminatia.com, 1 ilunion.tk, 1 ilusionistas.tk, 1 @@ -73074,6 +73022,7 @@ imo.pl, 1 imo.pt, 1 imoads.com, 1 imobile3.com, 1 +imobiliaa.ro, 1 imobiliare.tk, 1 imobiliariaemblumenau.com.br, 1 imobiliariamax.com.br, 1 @@ -73084,7 +73033,6 @@ imobilien.tk, 1 imoe.fun, 0 imojob.com, 1 imol.ai, 1 -imola.com.ua, 1 imolights.com, 1 imolights.net, 1 imolog.cl, 1 @@ -73662,7 +73610,6 @@ infermiere.roma.it, 1 inferno.co.uk, 1 infertilitycure.tk, 1 inffin-portal.de, 1 -infhosting.com.au, 1 infi.ch, 1 inficom.org, 1 infidel.org, 1 @@ -73684,7 +73631,6 @@ infiniteserieslabs.com, 1 infinitewealth.com.au, 1 infinitiofallentownparts.com, 1 infinitiofaugustaparts.com, 1 -infinitioflynnwoodparts.com, 0 infinitiofmarinparts.com, 1 infinitipartsdeal.com, 1 infinitiresearch.com, 1 @@ -73884,7 +73830,6 @@ infosactu.com, 1 infoschool.ml, 1 infosec.exchange, 0 infosec.md, 1 -infosec.mv, 1 infosecchicago.com, 1 infosecdecompress.com, 1 infosecindex.com, 1 @@ -74441,7 +74386,6 @@ instantprint.co.uk, 1 instantreplay.tk, 1 instantsiteaudit.com, 1 instar.org, 1 -instareeldownload.com, 0 instavites.com, 1 instawierszyki.pl, 1 instead.com.au, 1 @@ -74588,7 +74532,6 @@ intelcapital.com, 1 intelec.co.cr, 1 intelekta.es, 1 intelhost.com.br, 1 -intelics.com.au, 1 intelius.cf, 1 intellar.agency, 1 intellect-ls.com, 0 @@ -74814,7 +74757,6 @@ internetofinsecurethings.com, 1 internetoskol.tk, 1 internetovehazardnihry.cz, 1 internetowykantor.pl, 1 -internetpasoapaso.com, 1 internetpoem.com, 1 internetpro.me, 1 internetprofitspro.com, 1 @@ -74942,7 +74884,6 @@ intro.management, 1 intron.pw, 1 intropickup.ru, 1 intropika.tk, 1 -intrstd.in, 1 intrum-credit-information-ws.ch, 1 intstyle.com.ua, 1 intsurfing.com, 1 @@ -75214,6 +75155,7 @@ iotbusinessforum.com.br, 1 iotekha.tv, 1 iotfen.com, 1 iotflowers.com, 1 +iotjenik.eu, 1 iotmu.com, 1 iotportal.tk, 1 iotrasloco.it, 1 @@ -75272,7 +75214,6 @@ iparduotuves.lt, 1 iparenda.tk, 1 iparkki.com, 1 ipaustralia.gov.au, 1 -ipbox.eu.org, 1 ipcc-wg3.gov, 1 ipcim.com, 1 ipclabs.tk, 1 @@ -75710,7 +75651,6 @@ iscontrol.com.mx, 1 iscoolentertainment.com, 1 iscribblesolutions.com, 1 iscultas.pp.ua, 1 -isde.org, 1 isdecolaop.nl, 1 isdn.jp, 1 isdown.cz, 1 @@ -76012,6 +75952,7 @@ istudentpro.ml, 1 istudio.one, 1 isuggi.com, 1 isultov.tk, 1 +isurg.org, 1 isutils.com, 1 isuzucv.com, 1 isv.online, 1 @@ -76576,7 +76517,6 @@ iyan.es, 1 iyanla.com, 1 iyanmv.com, 1 iyassu.com, 1 -iyiarastir.com, 1 iyincaishijiao.com, 1 iyn.me, 1 iyouewo.com, 1 @@ -76929,6 +76869,7 @@ jakewartenberg.com, 1 jakincode.army, 1 jakincode.com, 1 jako.tk, 1 +jakob-bleek.de, 1 jakob-server.tk, 1 jakobbuis.nl, 1 jakobczyk.org, 1 @@ -76982,7 +76923,6 @@ james.pub, 1 jamesachambers.com, 1 jamesaimonetti.com, 1 jamesatruett.com, 1 -jamesbarnet.com, 1 jamesbillingham.com, 1 jamesbromberger.com, 1 jameschorlton.co.uk, 1 @@ -77095,6 +77035,7 @@ janekahonza.cz, 1 janelle-jamer.tk, 1 janellequintana.tk, 1 janenwouter.tk, 1 +janescottceramics.com, 1 janetandjohns.tk, 1 janetedkins.com, 1 janetevansyoga.co.uk, 1 @@ -77569,7 +77510,6 @@ jeancafe.ddns.net, 1 jeancampa.com, 1 jeancardeno.com, 1 jeancarlos.tk, 1 -jeanclaudegolvin.com, 1 jeandanielfaessler.ch, 1 jeanettegy.com, 1 jeanettevanrookhuizen.nl, 1 @@ -77709,7 +77649,6 @@ jellyfishlivewire.co.uk, 1 jellynails.tk, 1 jellypepper.com, 0 jellysquid.me, 1 -jelmer.co.uk, 1 jelmyto.com, 0 jelo.tk, 1 jelobox.tk, 1 @@ -77813,7 +77752,7 @@ jerichoproject.org, 1 jericoacoara.com, 1 jerisandoval.tk, 1 jeriss.be, 1 -jerlander.se, 1 +jerlander.se, 0 jeroendeneef.com, 1 jeroened.be, 1 jeroenensanne.wedding, 1 @@ -77994,6 +77933,7 @@ jfkvirtual.com.co, 1 jflmsan.pt, 1 jfmdevelopment.ml, 1 jfon.no, 1 +jforma.it, 1 jforums.org, 1 jfr.im, 1 jfreitag.de, 1 @@ -78056,7 +77996,6 @@ jiai.cf, 1 jiai.gq, 1 jiai.ml, 1 jiai.tk, 1 -jialiangkang.com, 1 jiami.dog, 0 jianbin.wang, 1 jiangmei.ml, 1 @@ -78218,7 +78157,6 @@ jinspace.net, 1 jintaiyang123.org, 1 jintao.hu, 1 jinzai-ikusei.org, 1 -jiogo.com, 1 jip2011.jp, 1 jipsnel.nl, 1 jira.com, 0 @@ -78549,7 +78487,6 @@ joellimberg.com, 1 joellombardo.com, 0 joelovano.com, 1 joelprice.com, 1 -joelving.dk, 0 joembayawaphotography.com, 1 joepitt.co.uk, 0 joerg-wellpott.de, 1 @@ -78568,7 +78505,6 @@ joeyfelix.com, 1 joeyhoer.com, 1 joeysglassbaytown.com, 1 joeysmith.com, 0 -joeysslimeventure.com, 1 joeyvanvenrooij.nl, 1 joeyvilaro.com, 1 jofel-kinderkleding.tk, 1 @@ -79125,6 +79061,7 @@ jpegminify.com, 1 jpekkala.com, 1 jperformance.nl, 1 jpg.am, 1 +jpg.fr, 1 jpg.tf, 1 jpgangbang.com, 1 jphev.de, 0 @@ -79181,6 +79118,7 @@ jrlopezoficial.com, 1 jrmora.com, 0 jrock.tk, 1 jrock.us, 1 +jrockrevolution.com, 1 jrom.net, 1 jross.me, 1 jrroofinglancs.co.uk, 1 @@ -79291,7 +79229,7 @@ jts3servermod.com, 1 jtsrepair.ca, 1 jttech.se, 1 jtwo.co.za, 1 -jtxdev.my.id, 1 +jtxdev.my.id, 0 jtxmail.org, 1 jtxserver.xyz, 1 ju-edu.tk, 1 @@ -79726,6 +79664,7 @@ justmyblog.net, 0 justmysocks.xyz, 1 justnajoua.tk, 1 justneworleans.com, 1 +justninja.com, 1 justnu.se, 0 justor.ru, 1 justpass.co.uk, 1 @@ -79835,7 +79774,6 @@ k-homes.net, 1 k-labs.be, 1 k-larevue.com, 1 k-linkcarecenter.com, 1 -k-lol.com, 1 k-matsudaclinic.com, 1 k-moto.sk, 1 k-net.dk, 1 @@ -80832,6 +80770,7 @@ kaufmanandassociates.com, 1 kaufmannkevin.de, 1 kaukauna.gov, 1 kaunoleliuteatras.lt, 1 +kauper.de, 1 kauperwood.ovh, 1 kaushal.tk, 1 kausharach.tk, 1 @@ -80891,7 +80830,6 @@ kayleen.net, 1 kaylielaw.com, 1 kayne.com, 1 kayon.cf, 1 -kayser-cs.lu, 1 kayseri.bel.tr, 1 kayserihaberleri.tk, 1 kaysville.gov, 1 @@ -81012,7 +80950,6 @@ kdb.uz, 1 kdcinfo.com, 1 kdcompany.ru, 1 kde-je-skladem.cz, 1 -kdgd.de, 1 kdhealing.com, 1 kdiender.nl, 1 kdistech.nz, 1 @@ -81544,12 +81481,11 @@ keyihao.cn, 1 keyinfo.io, 1 keykong.io, 1 keylength.com, 1 -keyloop.com, 1 +keyloop.com, 0 keymaster.lookout.com, 0 keymicrosystems.com, 1 keynes.id.au, 1 keyoxide.org, 1 -keypazar.tr, 1 keypers.io, 1 keyphotojs.cf, 1 keypoint.edu.au, 1 @@ -82104,6 +82040,7 @@ kingstonherald.com, 1 kingstonma.gov, 1 kingstonsoftware.de, 1 kingstream.uk, 1 +kingsurfa.com, 0 kingsvetcentre.com, 1 kingsvilletexas.com, 1 kingswinehaus.com, 1 @@ -82180,7 +82117,6 @@ kintone.com, 1 kintore.tv, 1 kintsugispace.com, 1 kintyre.net, 1 -kinualive.com, 1 kinugasa.or.jp, 1 kinvault.com, 1 kinyued.store, 1 @@ -82500,7 +82436,6 @@ klasko.ru, 1 klaspas.be, 1 klass-forklifts.ro, 1 klass-hydrauliks.fr, 1 -klass-hydrauliks.it, 1 klassen.tk, 1 klassenfahrt-tirol.at, 1 klassiekballet.tk, 1 @@ -82651,7 +82586,6 @@ klokkenluidersvg.nl, 1 kloop.kg, 1 klop.info, 1 klos-kremperler.at, 1 -klose-besser.com, 1 klose.family, 1 klosetestumgebungnextcloud.de, 1 klosko.net, 1 @@ -82684,7 +82618,6 @@ klustermedia.com, 1 klutchcard.com, 1 klute.spdns.de, 1 kluzza.nl, 1 -klva.cz, 1 km8.co, 1 kma.ua, 1 kmap-state-ks.us, 1 @@ -83279,7 +83212,6 @@ koodimasin.eu, 1 kooer.org, 1 koof.win, 1 kooky.org, 1 -koolbadges.co.uk, 1 kooli.ee, 1 koolisw.tk, 1 koolitee.ee, 1 @@ -83655,7 +83587,6 @@ krasnoyarsk24.tk, 1 krasotaiskusstva.com, 1 krasotkafirm.tk, 1 krasotki.ml, 1 -krastown.com, 0 krastyamoucha.cz, 1 kratochvilovi.net, 1 krause-outlet.de, 1 @@ -83689,10 +83620,8 @@ kreatywni.co, 1 kredi-hesaplama.com, 1 kredibanka.net, 1 kredigram.com, 1 -kredit-galerie.de, 1 kredit-mit-negativer-schufa.com, 1 kredit-ohne-schufa.de, 1 -kredit-schule.de, 1 kredit24.de, 0 kredita.dk, 1 kreditkarta.ml, 1 @@ -84305,7 +84234,7 @@ kurirplus.tk, 1 kuritsa.tk, 1 kurnia.tk, 1 kuroedov.com, 1 -kuroha.co.uk, 1 +kuroha.co.uk, 0 kuroinu.jp, 1 kuroit.com, 0 kurona.ga, 1 @@ -84405,6 +84334,7 @@ kvadru.cz, 1 kvalita-1a.cz, 0 kvalitetsaktiepodden.se, 1 kvalitetskatalog.tk, 1 +kvanli.com, 0 kvapay.com, 1 kvarta.tk, 1 kvartira-grad.tk, 1 @@ -85259,7 +85189,6 @@ landcomputer.hu, 1 landell.ml, 1 landers.com.au, 1 landeseiten-optimieren.de, 1 -landfire.gov, 1 landflirt.de, 1 landformlogic.com, 1 landforsale.co.il, 1 @@ -86237,6 +86166,7 @@ leadershipconnect.io, 1 leadgenie.me, 1 leadinforce.com, 1 leadingagile.com, 1 +leadingbytype.com, 1 leadiq.com, 1 leadnxt.co.in, 1 leadnxt.com, 1 @@ -86370,7 +86300,6 @@ leathercollection.fr, 1 leatherfur.tk, 1 leathergoods.tk, 1 leatherneckappliance.com, 1 -leathersofacleaning.co.uk, 1 leatherstreet.tk, 1 leatherwill.com.ua, 1 leauda.fr, 1 @@ -86398,7 +86327,6 @@ lebendige-heilkunst.de, 1 lebenpflegen-march.ch, 1 lebenpflegen.ch, 1 lebens-fluss.at, 1 -lebenshilfe-hannover.de, 1 lebensinselparaguay.tk, 1 lebensmittelwarnung.de, 0 lebesis.tk, 1 @@ -86496,7 +86424,7 @@ leebiblestudycenter.co.uk, 1 leebiblestudycenter.com, 1 leebiblestudycentre.com, 1 leebiblestudycentre.org, 1 -leebladon.com, 0 +leebladon.com, 1 leebruce.tk, 1 leech.ga, 1 leech.io, 1 @@ -86647,6 +86575,7 @@ legalnations.ga, 1 legalne-kasyna.com, 1 legalnews.cf, 1 legalnews.ml, 1 +legalneziolka.pl, 1 legalnorthamerican.ga, 1 legaloriginal.ga, 1 legalphase.ga, 1 @@ -87313,7 +87242,6 @@ leverageedu.com, 1 leverj.io, 1 levermann.eu, 1 leversconceptconstructions.com.au, 1 -leversonbudke.com, 1 leviaan.nl, 1 leviathan-studio.com, 1 leviathanfan.tk, 1 @@ -87462,12 +87390,12 @@ lgesteticaautomotiva.com.br, 1 lgfa.com.au, 1 lghairdressers.nl, 1 lghfinancialstrategy.ch, 0 -lgiswa.com.au, 1 +lgiswa.com.au, 0 lgmars.xyz, 1 lgmotors.cz, 1 lgnsh.fr, 1 lgobchod.cz, 1 -lgrs.com.au, 1 +lgrs.com.au, 0 lgsc.lv, 1 lgscripts.com.br, 1 lgsg.us, 1 @@ -87535,7 +87463,6 @@ liantao.com, 1 lianwen.kim, 1 liaozheqi.cn, 1 liar.wiki, 1 -liasecboard.com, 1 libanswers.com, 1 libanswers.net, 1 libapps.com, 0 @@ -87600,6 +87527,7 @@ libertyellisfoundation.org, 1 libertyga.tk, 1 libertygrovewi.gov, 1 libertyhillssewer.gov, 1 +libertyhomesavings.com, 0 libertylakewapd.gov, 1 libertyland.tk, 1 libertylondon.com, 1 @@ -87784,6 +87712,7 @@ lierohell.tk, 1 liersgevoel.nl, 1 liesbethkeijzer.nl, 1 lieuu.com, 0 +lifamily.xyz, 1 lifanov.com, 1 life-emotions.pt, 0 life-in-hell.tk, 1 @@ -88155,7 +88084,6 @@ lincolncountysd.gov, 1 lincolncountysheriffok.gov, 1 lincolncountytn.gov, 1 lincolncountywy.gov, 1 -lincolnfinewines.com, 1 lincolnil.gov, 1 lincolnimps.tk, 1 lincolnmoneyman.com, 1 @@ -88359,6 +88287,7 @@ linkycat.com, 1 linlemon66.com, 1 linmania.tk, 1 linmarka.com, 1 +linnaclinic.com, 1 linnaeusgroup.co.uk, 1 linncfs.top, 1 linncosomo.gov, 1 @@ -88821,7 +88750,6 @@ livealarm.com, 1 liveandalucia.es, 1 liveanimations.org, 1 livebandphotos.com, 1 -livebeachcam.net, 0 livebestbooks.gq, 1 livebookmark.ml, 1 livebox-mag.fr, 1 @@ -88914,7 +88842,6 @@ living-space.co.nz, 1 living-with-outlook-2010.com, 1 living.video, 1 livingafrugallife.com, 1 -livingbitsandthings.com, 1 livingdex.ca, 1 livingdocs.io, 1 livinghebrew.tk, 1 @@ -89144,7 +89071,6 @@ localcdn.org, 1 localcryptos.com, 1 locald.at, 1 localdating.ml, 1 -localenv.uk, 1 localethereum.com, 1 localexpert.realestate, 1 localexpress.io, 0 @@ -89272,7 +89198,6 @@ locksmiththewoodlands.com, 1 locksport.org.nz, 1 lockwoodonlinejournals.com, 1 loco-creations.nl, 1 -loco-socials.nl, 1 locomediagroep.nl, 1 locomotiv.tk, 1 locomotive.ca, 1 @@ -89350,7 +89275,6 @@ logfile.ch, 1 logfro.de, 1 logfurnitureplace.com, 1 logic8.ml, 1 -logical-invest.com, 1 logicalis.com, 1 logicalperformance.com, 1 logicchen.com, 1 @@ -89800,7 +89724,6 @@ lor.kharkov.ua, 1 loracheadle.com, 1 loraincountyohio.gov, 1 loraincountyrecorder.gov, 1 -lorasong.com, 1 loratadine10mg.gq, 1 lorbooks.tk, 1 lorcamadrid.tk, 1 @@ -89932,7 +89855,7 @@ lostcork.com, 1 lostcosmonaut.cc, 1 lostfest.co.uk, 1 lostfield.tk, 1 -lostfilm.cx, 1 +lostfilm.cx, 0 lostfilm.tv, 1 lostgeek.de, 0 losthighway.tk, 1 @@ -90155,7 +90078,6 @@ lovessentials.com, 1 lovesw.top, 1 lovetarot.jp, 1 lovethatmakeup.tk, 1 -lovetheprint.co.za, 1 lovetime.co.il, 1 lovetowork.tk, 1 loveuno.com, 1 @@ -90385,7 +90307,6 @@ lucasjquinn.com, 1 lucaslarson.net, 1 lucasmateus.ga, 1 lucastefanelli.dk, 0 -lucasvieira.fr, 0 lucciolachile.com, 1 luce.life, 1 lucentioluo.space, 1 @@ -90399,7 +90320,6 @@ luchshie-experty.top, 0 luchtspoor.nl, 1 lucia-art.cf, 1 lucia-riemer.de, 1 -luciara.mx, 1 lucid-light.de, 1 lucid-reality.ch, 1 lucidea.com, 1 @@ -90602,6 +90522,7 @@ lullugun.net, 1 luls.tk, 1 lulu960.xyz, 1 luludapomerania.com, 1 +lulugold.ba, 1 luluwoldtravel.com, 1 lumaesthetic.co.uk, 1 lumafestival.com, 1 @@ -90697,7 +90618,7 @@ lunepieters.co.za, 1 lunextd.com, 1 lungenexperte.at, 1 lungta.pro, 1 -lunguflorin.ro, 1 +lungustefan.com, 1 lungustefan.ro, 1 luniak.net, 1 lunight.ml, 1 @@ -90799,6 +90720,7 @@ luvare.com, 1 luvdress.com, 1 luve-gm.ch, 1 luvey.com, 1 +luviantrade.com.ec, 1 luvmihome.com, 1 luvscent.com, 1 lux-house.tk, 1 @@ -90868,7 +90790,6 @@ luxusnyvoucher.sk, 1 luxvacuos.net, 1 luxvide.it, 1 luxwatch.com, 1 -luxyachtingreece.com, 1 luyckx.net, 1 luzdelalma.net, 1 luzfaltex.com, 1 @@ -91167,7 +91088,6 @@ mabrav.ro, 1 mabusalah.tk, 1 mac-i-tea.ch, 0 macabeo.bio, 1 -macailabritton.com, 1 macalha.com, 1 macallan-tls.com, 1 macallantls.com, 1 @@ -91575,6 +91495,7 @@ magickery.com, 1 magickmale.de, 1 magiclen.org, 1 magicline.com, 1 +magicmayheim.com, 1 magicmistgroup.com, 1 magicocuoredimamma.it, 1 magicolr.com, 1 @@ -91980,7 +91901,6 @@ makelpunt.nl, 1 makemejob.com, 1 makemillion.tk, 1 makemoney-plan.tk, 1 -makemoney.ng, 1 makemusic-asia.com, 1 makemynewspaper.com, 1 makenaiyo-fx.com, 1 @@ -92057,7 +91977,6 @@ maladie-autoimmune.fr, 1 malafidezoeker.nl, 1 malagabaterias.com, 1 malagarental.com, 1 -malagarental.es, 1 malahov.tk, 1 malakye.com, 1 malami.gr, 1 @@ -92402,7 +92321,6 @@ maninternational.pro, 1 maniorpedi.com, 1 maniosglass.gr, 1 manipil.ch, 0 -manipurmatka.net, 1 manisahaberleri.tk, 1 manitaggarwal.com, 0 manitasavila.com, 1 @@ -92566,7 +92484,7 @@ manzanareshairph.com, 1 manzanita-nsn.gov, 1 maomihz.com, 1 maone.net, 1 -maorilandfilm.co.nz, 1 +maorilandfilm.co.nz, 0 maorx.cn, 1 maoshuai.bid, 1 maoshuai.cc, 1 @@ -93397,6 +93315,7 @@ maryleemacdonald.org, 1 maryluzturismo.co, 1 marymagdaleneshrine.org, 1 marymaloney.tk, 1 +marymarcotte.com, 1 marypierce.tk, 1 maryrock.net, 1 marysvilleks.gov, 1 @@ -93455,6 +93374,7 @@ masiavillalonga.com, 1 masiniunelte.store.ro, 1 masinky.tk, 1 masiorama.it, 1 +masjidalbayyinah.org, 1 masjidalnoorwairarapa.co.nz, 1 mask-skin.tk, 1 maskamuse.com, 1 @@ -93724,6 +93644,7 @@ mathesongas.com, 0 mathesonsteplock.ca, 1 matheusmacedo.ddns.net, 1 mathewlane.com, 1 +mathfilm.dk, 1 mathias.re, 0 mathiasbynens.be, 1 mathiasgarbe.de, 1 @@ -94024,7 +93945,6 @@ mauthausen-memorial.org, 1 mauthietkecafe.com, 1 mauticamp.ng, 1 mautwelt.de, 1 -mave.sh, 1 maveeranpasupathi.tk, 1 maven.ng, 0 maventrading.com, 0 @@ -94131,7 +94051,6 @@ maximoguk.com, 1 maximosilupu.tk, 1 maximovie.eu, 1 maxims-travel.com, 1 -maximschinese.com.hk, 1 maximumcontrol.nl, 1 maximumphysiotherapy.com, 1 maximusrose.com, 0 @@ -94302,6 +94221,7 @@ mbmassageterapi.se, 1 mbmbuild.com, 1 mbocentre.com, 1 mbong.kr, 1 +mbonlinesolutionsllc.com, 0 mbpskill.co.id, 1 mbr-net.de, 1 mbr.moe, 1 @@ -94780,6 +94700,7 @@ mecalux.es, 1 mecalux.nl, 1 mecambioamac.com, 1 mecanicoautomotriz.org, 0 +mecanique-casa.com, 1 mecaniquemondor.com, 1 mecanizadostrs.com, 1 mecari.tk, 1 @@ -95194,7 +95115,6 @@ mega.co.nz, 1 mega.io, 0 mega.nz, 1 mega.ru, 1 -mega888ios.com, 1 megaar.tk, 1 megabike.tk, 1 megabook.ml, 1 @@ -96226,7 +96146,6 @@ metromining.com.au, 1 metron-eging.com, 1 metron-networks.com, 1 metron-online.com, 1 -metron.mv, 1 metronidazolee.gq, 1 metronik.it, 1 metronome.ga, 1 @@ -96872,6 +96791,7 @@ migrainecollaborative.org, 1 migrainereliefplan.com, 1 migrantskillsregister.org.uk, 1 migrantworker.gov, 1 +migraplus.ru, 1 migrationlawfirm.com.au, 1 migrations.tk, 1 migrinfo.fr, 1 @@ -97245,7 +97165,6 @@ millibirlik.tk, 1 millibitcoin.jp, 1 milliegrace.org, 1 millikart.az, 1 -millionaire.email, 1 millionaireclub.tk, 1 millionairemethodsacademy.tk, 1 millioncloud.org, 1 @@ -97482,7 +97401,6 @@ minhyukpark.com, 1 mini-igra.tk, 1 mini-piraten.de, 1 mini-rock-festival.de, 1 -mini-trader.co.uk, 1 mini-zoo.club, 1 mini2.fi, 1 mini927moon.com, 1 @@ -97644,6 +97562,7 @@ minube.co.cr, 1 minucio.co, 1 minul.in, 1 minutamody.cz, 1 +minutashop.ru, 1 minuteflightdeals.com, 1 minuten-drogentests.de, 1 minutepunchline.com, 1 @@ -97759,6 +97678,7 @@ mirrormirror.tk, 1 mirrormirrorhairstyles.com, 1 mirrorsedgearchive.de, 1 mirrorsedgearchive.ga, 1 +mirrorwood.com, 1 mirrorz.help, 1 mirs.ky, 1 mirsa.sk, 1 @@ -97867,7 +97787,6 @@ missworldinfo.tk, 1 missycosmeticos.com.br, 1 missycraindance.com, 1 missyjay.tk, 1 -mist79.ru, 1 mistades.ga, 1 mistajsay.com, 1 mistaken.pl, 1 @@ -97970,7 +97889,7 @@ mitre-bedford.org, 1 mitre10.com.au, 0 mitrecaasd.org, 1 mitremai.org, 1 -mitroo.fun, 1 +mitroo.fun, 0 mitrostudios.com, 1 mitsannapolis.com, 1 mitsign.com, 1 @@ -98184,7 +98103,6 @@ mkt.cx, 1 mkt7.de, 1 mktcoral.com, 1 mktemp.org, 1 -mktzap.com.br, 1 mkultraclean.com.au, 1 mkw.st, 1 mkws.sh, 1 @@ -98419,6 +98337,7 @@ mobileciti.com.au, 1 mobilecraftingco.com, 1 mobilefactory.io, 1 mobilefidelity-magazin.de, 1 +mobilegameslist.com, 1 mobilegoldcoastelectrical.ga, 1 mobilehydraulics.com.au, 1 mobilelaby.com, 1 @@ -98596,7 +98515,6 @@ moderntech.dk, 1 moderntld.net, 1 moderntrainer.co.za, 1 moderntreasury.com, 0 -modernwebz.com, 1 modernworkplacelearning.co.za, 1 modernx.de, 1 modesalination.com, 1 @@ -98648,7 +98566,6 @@ moe.ci, 1 moe.tools, 1 moe4sale.in, 1 moebeltaxi-berlin.com, 1 -moeblog.cn, 1 moeblog.top, 1 moec.top, 1 moecater.com, 1 @@ -98678,7 +98595,6 @@ moeslinger-gehmayr.com, 1 moetrack.com, 1 moevps.com, 1 moewe.org, 1 -moexian.org, 1 moeyy.tech, 1 mof.gov.ws, 0 mofarennen.com, 1 @@ -98875,6 +98791,7 @@ momochrome.online, 1 momondersteuning.nl, 1 moms.com, 1 momsagainstcooties.com, 1 +momsays.co.za, 1 momsbangteens.com, 1 momsdemandaction.org, 1 momslickteens.com, 1 @@ -99243,6 +99160,7 @@ moodsta.com, 1 moodup.team, 1 moodyfssrequest.com, 1 mooglms.com, 1 +mooguire.com, 0 mooijwerk.com, 1 mooivoet.nl, 1 moojp.co.jp, 1 @@ -99703,6 +99621,7 @@ motorzone.od.ua, 1 motoselfservices.fr, 1 motospaya.com, 0 motostorie.blog, 1 +motostyle.ua, 1 mototax.ch, 0 mototeam.tk, 1 mototsi.com, 1 @@ -99808,7 +99727,7 @@ moveceara.com.br, 1 movefi.com.br, 1 moveisdecoracao.com.br, 1 moveissul.com.br, 1 -moveitmoveitmovers.com, 1 +moveitmoveitmovers.com, 0 moveltix.net, 1 movemais.com, 1 movember.com, 0 @@ -100036,7 +99955,7 @@ mrcomer.tk, 1 mrcool.com, 0 mrcool.store, 1 mrcooldiy.ca, 1 -mrcooldiy.com, 1 +mrcooldiy.com, 0 mrcoolevents.com, 1 mrcoolfranchise.com, 0 mrcoolfranchising.com, 0 @@ -100049,7 +99968,7 @@ mrd.ninja, 1 mrdatenschutz.de, 1 mrdayman.com, 1 mre.to, 1 -mredsanders.net, 1 +mredsanders.net, 0 mrephrase.com, 1 mrfactors.com, 1 mrfd.nl, 1 @@ -100059,7 +99978,6 @@ mrformaltuxedos.com, 1 mrfreshtruck.com, 1 mrg-srv.ru, 1 mrg-team.ru, 1 -mrgeek.ru, 1 mrgstaticcdn.ru, 1 mrgstaticcontent.ru, 1 mrguider.org, 1 @@ -100093,7 +100011,6 @@ mrmn.nl, 1 mrmoregame.de, 1 mrmosier.tk, 1 mrmostafaacademy.tk, 1 -mrmr.biz, 1 mrnabetterlife.com.sg, 1 mrnathanpowell.com, 1 mrnh.tk, 1 @@ -101065,6 +100982,7 @@ my-contract.ch, 0 my-contract.info, 0 my-contract.net, 0 my-coordinates.com, 1 +my-darkon.ru, 1 my-demo.co, 1 my-digital.fr, 1 my-dns.co.il, 1 @@ -101663,7 +101581,6 @@ mynas.ovh, 0 mynaturalmood.es, 1 mynaturebox.com, 0 mynaughtyalbum.com, 1 -mynaui.com, 1 myndcommunication.com, 0 myndighetermeddnssec.se, 1 myndighetermedipv6.se, 1 @@ -102797,6 +102714,7 @@ nationaalarchief.nl, 1 national-anime.com, 1 national-shitposting.agency, 1 nationalacademic.nl, 1 +nationalafs.com, 0 nationalaustriabank.com, 1 nationalbank.gov, 1 nationalbanken.dk, 1 @@ -103405,7 +103323,6 @@ negociemos.com.co, 1 negocios-imatore.com, 1 negociosparaoptimistas.com, 1 negociosurbanos.net, 1 -negoya-shokai.info, 1 negozimoda.it, 1 negoziointimo.com, 1 negr.gay, 1 @@ -103486,6 +103403,7 @@ nekrasowsky.ml, 1 nekrylov.ee, 0 nekrylov.org.ru, 0 nekrylov.spb.ru, 0 +nektr.co, 1 nekusoul.de, 1 nele.de, 1 nelebaehre.de, 1 @@ -103516,7 +103434,6 @@ nelsontwpoh.gov, 1 nelsonworldwide.com, 1 nelswong.com, 1 nelt.com, 1 -nelty.be, 1 nema.gov.au, 0 nemagiya.tk, 1 nemahacountyne.gov, 1 @@ -103745,7 +103662,6 @@ nesscitycatholic.org, 1 nessimworks.com, 1 nesstormented.tk, 1 nest-property.com, 1 -nesta.ie, 1 nestbynature.com, 1 nestdesigndeco.com, 1 nesterov.pw, 1 @@ -103824,7 +103740,7 @@ neteraser.de, 1 netevents.org, 1 netexlearning.com, 1 neteye.ru, 1 -netfabb.com, 1 +netfabb.com, 0 netface.com.br, 1 netferie.de, 1 netferie.dk, 1 @@ -104577,7 +104493,7 @@ nexon.com.au, 1 nexril.net, 0 nexs.gg, 1 nexscience.tk, 1 -nexsol-tech.ch, 0 +nexsol-tech.ch, 1 next-fact.com, 1 next-geek.fr, 1 next-idea.co, 1 @@ -104598,6 +104514,7 @@ nextcloud-miyamoto.spdns.org, 1 nextcloud-server.spdns.de, 0 nextcloud.com, 1 nextcloud.nerdpol.ovh, 1 +nextcloudblacksecure.fr, 1 nextcloudcn.com, 0 nextclouddarwinkel.nl, 1 nextdayvapes.co.uk, 1 @@ -104772,6 +104689,7 @@ ngtqa.com, 1 nguoimuahangmy.com, 1 nguru.net, 1 nguyenanhung.com, 1 +nguyencucthanh.com, 1 nguyenductrong.net, 1 nguyenduythiem.com, 1 nguyenfamily.cc, 1 @@ -105169,7 +105087,6 @@ nihilocomunidad.tk, 1 nihon-finance.com, 1 nihon-rosoku.com, 1 nihseniorhealth.gov, 0 -nihtek.in, 1 nihulkav.shop, 1 niice.co, 1 niid.lv, 1 @@ -105530,7 +105447,6 @@ nkontur.com, 1 nkorolev.tk, 1 nkp-media.de, 1 nkpr.net, 1 -nkrf.no, 1 nkrupp.net, 1 nktk.hu, 1 nkvd-farm.ru, 1 @@ -105652,7 +105568,6 @@ noaccess.tk, 1 noacore.ch, 1 noadi-pixels.tk, 1 noagendahr.org, 1 -noah-witt.com, 1 noahenco.nl, 1 noahjacobson.com, 1 noahmodas.com.br, 1 @@ -105785,7 +105700,6 @@ noincludesubdomains.preloaded.test, 0 noipro.com, 1 noirmale.com, 1 noirmalenetwork.com, 1 -noirpvp.com, 1 noiseboyz.com, 1 noisebridge.social, 1 noiseworks.ne.jp, 1 @@ -106051,6 +105965,7 @@ noroutine.com, 1 noroutine.me, 1 norridgewock.gov, 1 norrisautomotiveinc.com, 1 +norrisfeigum.com, 1 norrishome.tk, 1 norristn.gov, 1 norrkemi.se, 1 @@ -106792,6 +106707,7 @@ nucleuscore.org, 1 nucleuspanel.com, 1 nucoplus.com, 1 nudaveritas.tk, 1 +nudeai.com, 1 nudeandfresh.tk, 1 nudegirlphotos.com, 1 nudegirls.tv, 1 @@ -107063,7 +106979,6 @@ nwfdaz.gov, 1 nwfem.com, 1 nwh.nz, 1 nwhf.no, 1 -nwimports.com, 1 nwitt.us, 1 nwmpcllc.com, 1 nwn.fi, 1 @@ -107086,7 +107001,6 @@ nxcloud.ml, 1 nxdomain.info, 1 nxedge.com, 1 nxit.ca, 1 -nxlogis.kr, 1 nxnt.link, 1 nxplinc.com, 1 nxstudios.tk, 1 @@ -107138,6 +107052,7 @@ nyecountynv.gov, 1 nyerjakekszekkel.hu, 1 nyerjazoreoval.hu, 1 nyerjenaheraval.hu, 1 +nyflyguyz.com, 1 nyfurnitureoutlets.com, 1 nygbcomicguide.tk, 1 nygbtourguide.tk, 1 @@ -108508,6 +108423,7 @@ omicawholesale.com, 1 omid16b.com, 1 omidfan.ir, 0 omiltem.net, 1 +omind.ai, 1 omintmais.azurewebsites.net, 0 omipicon.io, 1 omitech.co.uk, 1 @@ -108949,6 +108865,7 @@ onlinedivorce.com, 1 onlinedivorce.lawyer, 1 onlinedoctornote.com, 1 onlinedoctranslator.com, 1 +onlinedrumminglessons.com, 1 onlineevent.ch, 1 onlinefile.repair, 1 onlinefilerepair.com, 1 @@ -109201,7 +109118,6 @@ op3racional.eu, 1 opaatct.com, 1 opaco.tk, 1 opadaily.com, 1 -opale-concept.com, 1 opalesurfcasting.net, 1 opalhunter.at, 1 opalstudio.fr, 1 @@ -109346,6 +109262,7 @@ opennippon.com, 1 opennippon.ru, 1 openpictures.ch, 1 openpix.com.br, 1 +openpowerfoundation.org, 1 openproton.cf, 1 openprovider.nl, 0 openqnx.com, 1 @@ -109466,7 +109383,6 @@ oplata-mvd.ga, 1 oplata-vklike.tk, 1 oplata.uz, 1 oplium.com, 1 -oplop.appspot.com, 1 opm.gov, 1 opmaakonderscheidingen.nl, 1 opnx.dk, 1 @@ -109638,6 +109554,7 @@ opture.ch, 1 optykgill.pl, 1 optymyze.com, 1 opulentdivision.com, 0 +opulentranch.com, 1 opus-codium.fr, 1 opus-labs.fr, 1 opus4.com, 1 @@ -109744,7 +109661,6 @@ orcamarine.tk, 1 orcas.tk, 1 orcasecurity.io, 1 orchardnh.org, 1 -orchestra-ppm.io, 1 orchestra.tk, 1 orchestremetropolitain.com, 1 orchidee-mariage.com, 1 @@ -109755,7 +109671,6 @@ orchidinsurance.com, 1 orchidparfum.eu, 1 orchidplantscare.com, 1 orchids.ua, 1 -orcinypress.com, 1 orcomsilver.tk, 1 orcon.de, 1 orcw.gov, 1 @@ -109927,7 +109842,6 @@ orion-rentals.tk, 1 orion-universe.com, 1 orioneclipse.com, 1 orionelement.com, 1 -orionfinancialservices.com, 1 oriongames.eu, 1 orionhermeticinterventions.com, 1 orionintel.es, 1 @@ -110743,7 +110657,6 @@ oyo.moe, 1 oyoshi.com.my, 1 oyosoft.net, 1 oyr79.tk, 1 -oysterboxhotel.com, 1 oysterlink.com, 1 oysterworldwide.com, 1 oytic.com, 1 @@ -110847,6 +110760,7 @@ p30mororgar.ir, 1 p333b.net, 1 p333e.net, 1 p333j.net, 0 +p35consulting.com, 1 p36533.com, 1 p4.pm, 1 p4c-admin.azurewebsites.net, 1 @@ -111101,7 +111015,7 @@ pageboard.io, 1 pagebuilderaddons.com, 1 pagecrafter.com, 1 pagedesignpro.com, 1 -pagedesignshop.com, 0 +pagedesignshop.com, 1 pagefulloflies.io, 1 pagehost.one, 1 pagemedical.co.uk, 1 @@ -111603,6 +111517,7 @@ papi.com, 1 papieri.dental, 1 papierniak.net, 1 papierniczy.eu, 1 +papierowyrycerz.pl, 1 papillegustative.com, 1 papillon-events.be, 1 papirladen.dk, 1 @@ -111651,7 +111566,7 @@ paradisim.tk, 1 paradisu.fr, 1 paradoxhotels.com, 1 paradoxium.ml, 1 -paradymecompanies.com, 0 +paradymecompanies.com, 1 paraelganzo.tk, 1 parafarmacia.it, 1 paragardmdlportal.com, 1 @@ -112019,7 +111934,6 @@ partyaccommodationsers.ga, 1 partyaccommodationsest.ga, 1 partyausstatter24.de, 1 partyblitzsimi.com, 1 -partybutlers.co.uk, 1 partyclub.tk, 1 partycoin.ga, 1 partyevents.tk, 1 @@ -112115,6 +112029,7 @@ passionpictures.eu, 1 passions-art.com, 1 passiton.com, 1 passive-work.gq, 1 +passiveblogger.com, 1 passivebook.com, 1 passivehousecal.org, 1 passiveseinkommen.tk, 1 @@ -112239,7 +112154,6 @@ pathsaversest.ga, 1 pathwayscenterforgrief.org, 1 pathwayscenterforgriefandloss.org, 1 pathwaysthroughgrief.org, 1 -pathzero.com, 0 patient.info, 1 patientcheckin.com, 1 patientenverfuegung.digital, 1 @@ -112457,6 +112371,7 @@ paw.pt, 1 pawafuru.com, 0 pawapuro.ga, 1 pawapuro.tk, 1 +pawbuddi.com, 1 pawc.cc, 1 pawchewgo.com, 1 pawdecor.com, 1 @@ -112642,7 +112557,6 @@ pb-eatz.com, 1 pb.ax, 0 pbaby.com, 1 pback.se, 1 -pband.ch, 1 pbbm.com.ph, 1 pbc.gov, 1 pbcables.tk, 1 @@ -113178,6 +113092,7 @@ pensador.info, 1 pensatore.tk, 1 pensia.tk, 1 pensieridigitali.tk, 1 +pensierolaterale.tech, 1 pensioenfonds-ey.nl, 0 pension-am-alten-waschhaus.de, 1 pension-chevaux.com, 1 @@ -113681,7 +113596,6 @@ petegrahamcarving.co.uk, 1 petelew.is, 1 petemerges.com, 1 petemerges.xyz, 1 -peter-r.co.uk, 1 peter-rader.pro, 1 peter-taban.de, 1 peter-zhu.ca, 1 @@ -114033,7 +113947,6 @@ pharmasana.ru, 1 pharmasyncers.ga, 1 pharmasyncest.ga, 1 pharmgkb.org, 1 -pharmica.uk, 1 pharosconsulting.com, 1 pharosiq.com, 1 pharside.dyndns.org, 1 @@ -114143,7 +114056,6 @@ philipsmanythougths.ml, 1 philipssupportforum.com, 1 philipstewart.uk, 1 philipthomas.com, 1 -philipzhan.com, 1 philipzhan.tk, 1 philis-oenologie.fr, 1 phillipgoldfarb.com, 1 @@ -114174,6 +114086,7 @@ philwilson-green.ml, 1 phimbop.top, 1 phimmoingay.org, 0 phimtor.com, 1 +phinikarides.net, 1 phiomegachi.tk, 1 phishguard.sa, 1 phishing-studie.org, 1 @@ -114864,6 +114777,7 @@ pinleather.rs, 0 pinmeto.com, 1 pinnacle-tex.com, 1 pinnaclecommunityservices.com.au, 1 +pinnaclefoundationrepair.com, 1 pinnacleholdings.com, 1 pinnaclelife.nz, 1 pinnacletrailers.com, 1 @@ -115076,6 +114990,7 @@ pivnica.cf, 1 pivnica.ga, 1 pivnica.gq, 1 pivnica.tk, 1 +pivotalbarcode.com, 1 pivotanimation.org, 1 pivotanimation.tk, 1 pivovarcunak.cz, 1 @@ -115098,7 +115013,6 @@ pixel-perfection.com, 1 pixel-puls.de, 1 pixel.facebook.com, 0 pixel.google.com, 1 -pixel4k.com, 1 pixelbass.nl, 1 pixelbattle.fun, 1 pixelcatproductions.net, 1 @@ -115369,7 +115283,7 @@ planisanin.tk, 1 planiserin.tk, 1 planisware.academy, 1 planisware.cn, 1 -planisware.io, 1 +planisware.live, 1 planisys.net, 1 planit-inc.com, 1 planitz.com, 1 @@ -115605,7 +115519,6 @@ playxylo.com, 1 playzone.tk, 1 plaza-athenee.com, 1 plaza.ph, 1 -plazacovadonga.com, 1 plazait.co.id, 1 plazaservicesllc.com, 1 plazasummerlin.com, 1 @@ -115771,6 +115684,7 @@ pluslink.co.jp, 1 pluspass.com, 1 plusport-api.com, 1 plusport.com, 1 +plusreed.com, 1 plustwik.com, 1 plutiedev.com, 1 pluto5000.com, 1 @@ -116111,7 +116025,6 @@ poetics.tk, 1 poetka.tk, 1 poetry.ge, 1 poetryinmusic.tk, 1 -poetsgate.com, 0 poetsjeboot.nl, 1 poezja.art, 1 poezja.com.pl, 1 @@ -116123,7 +116036,6 @@ pogljad-brest.tk, 1 pogodavolgograd.tk, 1 pogodok.tk, 1 pogomate.com, 1 -pogoswine.com, 1 pogotowie-komputerowe.tk, 1 pogotowiekomputeroweolsztyn.pl, 1 pogrebeniq-sofia.com, 1 @@ -116218,6 +116130,7 @@ pokerventure.ga, 1 pokerventureers.ga, 1 pokerventureest.ga, 1 pokerzone.com, 1 +pokeymanatee4.xyz, 1 poki.at, 1 poki.be, 1 poki.bg, 1 @@ -116390,7 +116303,6 @@ pollet-ghijs.be, 1 pollet-ghys.be, 1 pollet.tech, 1 pollev-embeds.com, 1 -pollev.com, 1 polleverywhere.com, 1 polliga.tk, 1 pollinators.ie, 1 @@ -116486,7 +116398,6 @@ pondband.net, 1 pondof.fish, 1 pondot.it, 1 pondsama.com, 1 -pondsec.com, 1 ponga.se, 1 pongplace.com, 1 ponio.org, 1 @@ -116533,7 +116444,8 @@ poolsonline.tk, 1 poolspa.es, 1 pooltools.net, 1 poolvilla-margarita.net, 1 -poonawallafincorp.com, 1 +poon.io, 1 +poonawallafincorp.com, 0 poopa.loan, 1 poopjournal.rocks, 1 poopr.ru, 1 @@ -117362,7 +117274,6 @@ prana-coachings.ch, 1 prana-me.com, 1 pranabesh.com, 1 pranafilms.tk, 1 -prancor.ru, 1 pranita-schals.de, 0 pranita.cz, 0 pranita.sk, 0 @@ -117374,6 +117285,7 @@ praser.net, 1 prashantcafe.tk, 1 prasinoscomputers.ml, 1 prasos.fi, 1 +prataus.com, 0 prateep.io, 1 pratelloshop.tk, 1 pratemarkets.com, 1 @@ -117772,7 +117684,6 @@ prevu3d.com, 1 preweather.com, 1 prexxorvita.com, 1 prezentmarzen.com, 1 -prezista.com, 1 preziti.eu, 1 prfanfiction.tk, 1 prg.rs, 1 @@ -117818,6 +117729,7 @@ prijelapout.cz, 1 prijsvergelijken.ml, 1 prikeshsavla.com, 1 prikolkz.tk, 1 +prim-wash.de, 1 prima-backoefen.de, 1 prima-badezimmermoebel.de, 1 prima-bohrmaschinen.de, 1 @@ -117858,7 +117770,6 @@ primalsurvivor.net, 1 primananda.com, 1 primanota.ch, 0 primapak.bg, 1 -primariachisineucris.ro, 1 primarium.info, 1 primary.health, 1 primarycareconnect.com.au, 1 @@ -117960,7 +117871,6 @@ print-street.tk, 1 printable-map-az.com, 1 printablemapaz.com, 1 printablemapforyou.com, 1 -printableschedule.net, 1 printandgo.fr, 1 printbase.cz, 0 printbigjournal.tk, 1 @@ -118059,6 +117969,7 @@ privacyinternational.org, 1 privacymanatee.com, 1 privacynator.eu, 1 privacynow.eu, 1 +privacypro.io, 1 privacyredirect.com, 1 privacysavvy.com, 1 privacyscore.org, 1 @@ -118113,13 +118024,11 @@ privatespace.uk, 1 privatetrainingonline.se, 1 privateuploader.com, 1 privatevpn.com, 1 -privatmeet.com, 1 privatstunden.express, 1 privc.io, 1 privcloud.cc, 1 privcloud.org, 1 privcom.net, 1 -privea.fr, 1 priveadressen.tk, 1 privelust.nl, 1 priverify.com, 1 @@ -118504,7 +118413,6 @@ project-alice.io, 1 project-forum.tk, 1 project-haystack.org, 1 project-ice.org, 1 -project-merlin.co.uk, 1 project-novis.org, 1 project-one.co.jp, 1 project-rune.tech, 1 @@ -118555,7 +118463,6 @@ projectstem.org, 1 projecttalent.be, 1 projectte.ch, 1 projectunionx.com, 1 -projectvault.ovh, 1 projectveritasaction.com, 0 projectweb.gr, 1 projectxyz.eu, 1 @@ -118634,7 +118541,7 @@ promodoble.com, 1 promods.net, 1 promods.store, 1 promofirstmedia.co.id, 1 -promohulp.nl, 1 +promohulp.nl, 0 promohunt.ru, 0 promokodi.tk, 1 promolife.be, 1 @@ -118658,7 +118565,6 @@ promotor.ro, 1 promove.be, 1 promovendum.nl, 1 promozioni.it, 1 -prompt.icu, 1 promptdig.com, 1 promptwars.io, 1 promuovi.tv, 1 @@ -119341,7 +119247,6 @@ publicagent.com, 1 publicamenucards.com, 1 publicare-gmbh.de, 1 publiccarauctionscalifornia.com, 1 -publicdatafiles.com, 1 publicdatalibrary.org, 1 publicdelivery.org, 1 publicdomainartwork.com, 0 @@ -119499,6 +119404,7 @@ punkrestaurant.is, 1 punksway.top, 1 punkt05.de, 1 punktum.dk, 1 +punokio.com, 1 punshjp.com, 1 puntacanabavaro.com, 1 puntacanalink.com, 1 @@ -119768,7 +119674,6 @@ pwcva.gov, 1 pwd.az, 1 pwd.hu, 1 pwd.vc, 1 -pwddelhi.gov.in, 1 pwdsafe.com, 0 pwe.vision, 1 pwg-see.de, 1 @@ -119941,7 +119846,6 @@ qbcorescripts.com, 1 qbiltrade.com, 1 qbits.li, 1 qbojj.eu, 1 -qbrix.dk, 1 qbstores.com, 1 qbug.cf, 1 qburst.com, 1 @@ -120053,7 +119957,6 @@ qisda.com.tw, 1 qisda.com.vn, 1 qisheiosxz.com, 1 qitano.com, 1 -qitarabutrans.com, 0 qiu.moe, 0 qiuwenbaike.cn, 1 qivonline.pt, 1 @@ -120396,6 +120299,7 @@ queenhub.tk, 1 queenkedi.net, 1 queenlexie.tk, 1 queenmargaret.ddns.net, 1 +queenofvogue.com, 1 queenondvd.tk, 1 queenparis-porn.com, 1 queenrocks.tk, 1 @@ -121052,7 +120956,6 @@ radioj.fr, 0 radiojackienorth.tk, 1 radiojeneverstoker.tk, 1 radioklara.org, 1 -radioknop.nl, 1 radiokontakt.tk, 1 radiokukesi.tk, 1 radiolanguages.tk, 1 @@ -121186,7 +121089,6 @@ raeven.nl, 1 raewardfresh.co.nz, 1 raf.org, 1 rafaelangelfg.tk, 1 -rafaelmperez.com, 1 rafaeloliva.com.br, 1 rafaelortiz.es, 1 rafaelsobis.tk, 1 @@ -121420,7 +121322,6 @@ raku.land, 1 rakudo.org, 1 rakugokai.net, 1 rakuvisa.com, 1 -rakweb.com.br, 1 ralaoui.com, 1 ralaoui.me, 1 raleighadultmedicine.com, 1 @@ -121579,7 +121480,6 @@ rangeforce.com, 1 rangeforce.eu, 1 rangerfiles.tk, 1 rangersloyalsite.tk, 1 -rangersofbelgium.be, 1 rangeweb.ga, 1 ranginkamonkadeh.ir, 1 rangsmo.se, 0 @@ -121842,6 +121742,8 @@ rawlinswy.gov, 1 rawlord.ga, 1 rawmarkable.co.uk, 1 rawmathub.gr, 1 +rawpearls.co.uk, 1 +rawpearls.com, 1 rawr.sexy, 1 rawrvixen.com, 1 raxion.cf, 1 @@ -122392,9 +122294,6 @@ recode-lang.com, 1 recoilbox.com, 1 recolic.cc, 1 recolic.net, 1 -recollect.co.nz, 1 -recollect.net.au, 1 -recollectcms.com, 1 recollection.fr, 1 recollective.com, 1 recolor.ml, 1 @@ -122453,7 +122352,6 @@ recursosilimitados.tk, 1 recursosimbiopos.com, 1 recursosmi.com.br, 1 recursosrev.tk, 1 -recycle-it.com.au, 1 recycle.cf, 1 recyclebin.email, 1 recycledinorsett.co.uk, 1 @@ -122486,17 +122384,14 @@ redass.me, 1 redaxo.org, 1 redballoonsecurity.com, 1 redbeardplumbing.net, 0 -redbrown.ru, 1 redcabbage.tk, 1 redcanary.co, 1 redcandycane.tk, 1 redcapital.cl, 1 redcardinal.tk, 1 -redcarnationhotels.com, 1 redcarpetmonday.com, 1 redcatrampageforum.com, 1 redcedar.gov, 1 -redchameleon.com.ua, 1 redchat.cz, 1 redciudadesclima.es, 1 redcode-web.design, 1 @@ -122806,7 +122701,6 @@ refpaicctvtm.top, 1 refpaikgai.top, 1 refpajqhsd.top, 1 refpakrtsb.top, 1 -refpakwpsrbm.top, 1 refpalqtdn.top, 1 refpanjoke.com, 1 refpaqutiu.top, 1 @@ -122921,6 +122815,7 @@ regionstea.net, 1 regioplanverbindt.nl, 1 regioprint-werbeagentur.de, 1 regiosalland.nl, 1 +regioseguros.com.br, 1 regiotaxi-s-hertogenbosch.nl, 1 regiotaxidenbosch.nl, 1 regiotaxishertogenbosch.nl, 1 @@ -123741,7 +123636,6 @@ responsive.io, 0 responsivepaper.com, 1 respostas.com.br, 1 respublica.cl, 1 -ressourcement-interieur.com, 1 ressourceportal.dk, 1 ressourcesindivior.com, 1 ressourcesleopharma.fr, 1 @@ -123778,7 +123672,6 @@ restauratori.it, 1 restauratorin-maubach-dresden.de, 1 restaured.net, 1 restauriedili.roma.it, 1 -restbygait.com, 1 rester-a-domicile.ch, 1 rester-autonome-chez-soi.ch, 1 restic.net, 1 @@ -123826,7 +123719,6 @@ resumeworded.com, 1 resumic.com, 1 resumic.dev, 1 resumic.io, 1 -resumic.net, 1 resumic.org, 1 resurfacehub.com, 1 resurgent.network, 1 @@ -123891,7 +123783,6 @@ retro.rocks, 1 retroarms.com, 1 retroarms.cz, 1 retrobook.tk, 1 -retrocdn.net, 1 retrodunes.com, 1 retrogamenews.tk, 1 retrogarb.co.uk, 1 @@ -125210,6 +125101,7 @@ rodeofx.com, 1 rodeohire.com, 1 rodeosales.co.uk, 1 roder-skarf.se, 1 +rodgersawnings.com, 1 rodichi.net, 1 rodin.tk, 1 rodinka.tk, 1 @@ -125293,7 +125185,7 @@ roguerocket.com, 1 roguetech.ca, 1 roguevalleywinecountry.com, 1 rohal.tk, 1 -rohanbassett.com, 1 +rohanbassett.com, 0 rohansingh.cf, 1 rohde.de, 0 rohedaten.de, 1 @@ -125479,7 +125371,6 @@ roninathletics.com, 1 roninf.ch, 1 roninitconsulting.com, 1 roninmotorsports.net, 1 -ronkeesom.nl, 1 ronlinemarketing.com, 1 ronniegane.kiwi, 1 ronnylindner.de, 1 @@ -125613,7 +125504,6 @@ rosabellas.co.uk, 1 rosabrasiv.ga, 1 rosacosmos.tn, 1 rosaflorbijoux.com.br, 1 -rosakkreditatsiya-forum.ru, 1 rosalinda.cl, 1 rosalindturner.co.uk, 1 rosalopezcortes.tk, 1 @@ -126146,7 +126036,6 @@ rtjobsite.com, 1 rtkbe.com, 1 rtlnitro.de, 1 rtlspiele.de, 1 -rtm.kr, 0 rtmi.co.il, 1 rtmoran.org, 1 rtmtech.ru, 1 @@ -126208,7 +126097,6 @@ rubenplazagarcia.es, 1 rubens.cloud, 0 rubensalgado.com, 1 rubenschulz.nl, 1 -rubenshotel.com, 1 rubenshuis.be, 1 rubenslikkarchive.com, 1 rubensteinphotography.com, 1 @@ -126277,7 +126165,6 @@ ruecklinger.net, 1 ruecommune.fr, 1 ruediger-voigt.eu, 1 ruedigervoigt.de, 1 -ruedirrenggli.ch, 0 ruedumas.freeboxos.fr, 1 rueduparticulier.tk, 0 rueg.eu, 1 @@ -126535,7 +126422,6 @@ russianbristol.tk, 1 russiancrimes.in.ua, 1 russianews.cf, 1 russianews.ga, 1 -russianflora.com, 1 russianflora.ru, 1 russianpostcalc.ru, 1 russianpunkrock.tk, 1 @@ -126659,7 +126545,6 @@ rxbusiness.com, 1 rxcarbon.com, 1 rxcom.net, 1 rxhill.com, 1 -rxkids.org, 1 rxperiusdata.com, 1 rxphoto.com, 1 rxss.com, 1 @@ -127524,7 +127409,7 @@ saltcave.gq, 1 saltedfish.network, 1 saltedfishes.com, 1 saltedge.com, 1 -saltedpasta.com, 1 +saltedpasta.com, 0 saltercane.com, 0 saltlakecounty.gov, 1 saltlakehealth.gov, 1 @@ -127553,7 +127438,6 @@ saluels.servemp3.com, 1 salukinet.tk, 1 salunganogroup.com, 1 salus-cm.care, 1 -salus.zone, 1 salut-butovo.cf, 1 salutes.tk, 1 salutethefish.com, 1 @@ -127691,7 +127575,6 @@ sampsonplumbing.com, 0 samquick.me.uk, 1 samroelants.com, 1 samsara.nl, 1 -samsat.info, 1 samsatcorner.com, 1 samscollection.in, 1 samsebe.ml, 1 @@ -127743,6 +127626,7 @@ sana-commerce.com, 1 sana-store.com, 1 sana-store.cz, 1 sana-store.sk, 1 +sanafide.com, 0 sanagustin.com, 1 sanalaile.tk, 1 sanalikaforum.tk, 1 @@ -127965,7 +127849,6 @@ sanraizu.top, 1 sanroque.es, 1 sans-hotel.com, 1 sans-papiers.ch, 1 -sansaenergy.com, 1 sansairyu-kuyoukai.com, 1 sansdb.io, 0 sansdict.ml, 1 @@ -128043,7 +127926,6 @@ santmark.org, 1 santo.fi, 1 santodelgiorno.it, 1 santong.tk, 1 -santons-fouque.fr, 1 santorinidress.com, 1 santoscarmelitas.tk, 1 santosdecordoba.tk, 1 @@ -128417,7 +128299,6 @@ savedana.tk, 1 saveeachlife.com, 1 savehumanitynow.com, 1 savejonasquinn.tk, 1 -savemycent.com, 1 savemyexams.co.uk, 1 savemyleads.com, 1 savemylicence.co.uk, 1 @@ -129532,7 +129413,6 @@ seagrace.com, 1 seagrass-salcombe.com, 1 seagull-seafarer.org, 1 seahaweb.org, 1 -seaholmwines.com, 1 seaif.org, 1 seal-tite.eu, 1 sealability.co.uk, 1 @@ -129564,6 +129444,7 @@ seankrichmar.com, 1 seanmeedevworld.com, 1 seanrayford.com, 1 seanrodda.com, 1 +seanstaffiery.com, 1 seaoak.jp, 1 seaoftime.tk, 1 seaplayhomes.com, 1 @@ -129911,6 +129792,7 @@ securitytalk.pl, 1 securitytestfan.gov, 1 securitytrails.com, 1 securityvulns.com, 1 +securityvulns.ru, 1 securitywatch.co.nz, 1 securityweekly.com, 1 securitywithnick.com, 1 @@ -129997,7 +129879,6 @@ seet.com.au, 1 seetheprogress.com, 1 seetheprogress.de, 1 seetheprogress.eu, 1 -seetheprogress.net, 1 seetheprogress.org, 1 seetow.sg, 1 seetv.ga, 1 @@ -130149,7 +130030,6 @@ selbst-schreinern.de, 0 selbstverteidigung-catmove.de, 1 selco-himejiminami.com, 1 selcusters.nl, 1 -selea.se, 1 selebrita.ml, 1 selecadm.name, 1 selectables.tk, 1 @@ -131122,7 +131002,6 @@ sexspb.love, 1 sexswing.com, 0 sextacy.tk, 1 sextapegermany.com, 1 -sextoysproductstore.com, 1 sextpanther.com, 1 sextreffendeutschland.com, 1 sextw.net, 1 @@ -131675,7 +131554,6 @@ sheepsound.tk, 1 sheet.host, 1 sheetengine.net, 1 sheetflowpro.com, 1 -sheetseeker1486.it, 1 sheezy.art, 1 sheezy.blog, 1 sheezy.games, 1 @@ -132131,7 +132009,6 @@ shoporangetheory.com, 1 shoposal.com, 1 shopperexpertss.com, 1 shoppersdepuertorico.com, 1 -shoppersvineyard.com, 1 shoppies.tk, 1 shopping-cart-migration.com, 1 shopping-il.org.il, 1 @@ -132620,7 +132497,6 @@ sidik.web.id, 1 sidingsmedia.com, 1 sidiprojects.us, 1 sidirokastro.ga, 1 -sidium.de, 1 sidmax.ca, 1 sidneymi.gov, 1 sidnicio.us, 1 @@ -132693,7 +132569,6 @@ siggi.io, 1 sight-restoration.tk, 1 sight-sound.com, 1 sightandsound.co.uk, 1 -sightcure.jp, 1 sightfactory.com, 1 sightful.be, 1 sightful.eu, 1 @@ -132749,7 +132624,6 @@ signatureresolution.com, 1 signaturerx.co.uk, 1 signaturesmilesstudio.com, 1 signcreative.de, 1 -signdeer.com, 1 signeen.com, 1 signeen.net, 1 signere.com, 1 @@ -133315,7 +133189,6 @@ singaporeconventionweek.sg, 1 singaporecriminaldefencelawyer.com, 1 singaporedivorcelawyer.com, 1 singaporefamilylawyer.com, 1 -singaporepsa.com, 1 singaporetoptentravel.com, 1 singaporewebdesign.tk, 1 singapur24.tk, 1 @@ -133442,7 +133315,6 @@ sircon.no, 1 sirena.ml, 1 sirenassociates.com, 0 sirenasweet.net, 1 -sirenasweet.org, 1 sirencallofficial.com, 1 sirenequestrianvaulting.co.uk, 1 sirenequestrianvaulting.com, 1 @@ -133711,7 +133583,6 @@ skaala.com, 1 skaalen.com, 1 skaapkraalonline.co.za, 1 skabour.co.uk, 1 -skachat-filmi.info, 1 skachat-programmylini.ga, 1 skachat-shablon-rezyume-na-angliyskom-yazyk.tk, 1 skachat-zip.tk, 1 @@ -134224,7 +134095,6 @@ slaskie.pl, 1 slate.fr, 1 slate.to, 1 slated.ie, 0 -slatemc.com, 1 slatemc.fun, 1 slateteams.com, 0 slathering.cf, 1 @@ -134494,9 +134364,8 @@ smallcubed.com, 1 smalldeveloper.ml, 1 smallfarmersjournal.com, 1 smallfoot.tk, 1 -smallguard.fr, 1 smallingerland.nl, 1 -smallplanet.com, 0 +smallplanet.com, 1 smalls-world.tk, 1 smallsiri.gq, 1 smallsites.eu, 1 @@ -134613,7 +134482,6 @@ smartgirls.tk, 1 smartglassworld.net, 1 smartguardzone.kr, 1 smarthdd.com, 1 -smarthealthinnovationlab.com, 1 smarthis.com, 1 smarthomegeldermalsen.nl, 1 smarthrms.com, 1 @@ -134640,7 +134508,6 @@ smartlogreturns.com, 1 smartlogstock.com, 0 smartlogtower.com, 1 smartlooks.es, 1 -smartmail.io, 1 smartmail24.de, 1 smartme.pl, 1 smartmeal.ru, 1 @@ -134716,7 +134583,7 @@ smash-gg.club, 1 smashbros-chile.tk, 1 smashbylaney.com, 1 smashcooper.tk, 1 -smashingconf.com, 1 +smashingconf.com, 0 smashingmagazine.com, 1 smashnl.tk, 1 smashno.ru, 1 @@ -134727,7 +134594,6 @@ smb-bsa.ca, 1 smb.wiki, 1 smb445.com, 1 smbabyshop.gr, 1 -smbalaji.com, 1 smbc.direct, 1 smbcmanubank.com, 1 smbi-gelblasterhq.com.au, 1 @@ -135434,7 +135300,6 @@ softonit.ru, 1 softonline.net, 1 softpark.cf, 1 softpark.ml, 1 -softpas.com, 1 softplay4hire.co.uk, 1 softpractice.com, 1 softref.com, 1 @@ -135694,7 +135559,6 @@ solutionalbum.com, 1 solutionbuilders.com, 1 solutionmotsfleches.com, 1 solutionpieces.com, 1 -solutionplumber.com, 1 solutions-ii.com, 1 solutions-it.net, 1 solutions-visuelles.ch, 1 @@ -135917,7 +135781,6 @@ soph.tk, 1 soph.us, 1 sopheos.com, 0 sopher.io, 1 -sophia.com.br, 1 sophiafoundation.org, 1 sophiajaneboutique.com, 1 sophiakligys.com, 1 @@ -136037,7 +135900,6 @@ sossinistres.ca, 1 sostacancun.com, 1 soste.fi, 0 sosyalevin.com, 1 -sosyalitya.com, 1 sosysadmin.com, 1 sosz.org, 1 sota.sh, 1 @@ -136122,7 +135984,6 @@ soundee.com, 1 soundeo.com, 1 soundeo.net, 1 soundersmusic.com, 1 -soundersu23.com, 1 soundexclusive4ever.tk, 1 soundfingers.com, 1 soundgasm.net, 1 @@ -136993,7 +136854,6 @@ sportcompactwarehouse.com, 1 sportcucc.hu, 1 sportda.tk, 1 sportedy.com, 1 -sportellocafpatronato.com, 1 sportencultuurintrobreda.nl, 0 sportfair.it, 1 sportfits.at, 1 @@ -137287,7 +137147,6 @@ sqtelcrm.ua, 1 squad.fr, 1 squadco.com, 1 squadcoders.com, 1 -squadgames.ru, 1 squamiferum.net, 1 squardllc.ml, 1 square-gamers.tk, 1 @@ -137299,7 +137158,6 @@ square.it, 1 square.ly, 1 square.mx, 1 square.site, 1 -square1.de, 1 squarecdn.com, 1 squaredancedance.tk, 1 squaredaway.co.nz, 1 @@ -137917,6 +137775,7 @@ staring.tk, 1 staringer.net, 1 starinup.com, 1 starinvestama.co.id, 1 +starinvestingship.com, 0 starka.st, 1 starken.com, 1 starking.net.cn, 1 @@ -138091,7 +137950,6 @@ staticline.de, 0 staticweb.tk, 1 statik.space, 1 stationa.ch, 0 -stationary-traveller.eu, 1 stationaryengines.tk, 1 stationcharlie.co.za, 1 stationhousecattery.com, 1 @@ -138256,6 +138114,7 @@ steelmounta.in, 1 steelnavi.jp, 1 steelpoint.com.pl, 1 steelsheds.biz, 1 +steelsoldiers.com, 1 steelstructuresltd.com, 1 steelvortex.tk, 1 steelzone.tk, 1 @@ -138698,6 +138557,7 @@ stipic-webit.de, 1 stirblaut.de, 1 stirchleybaths.org, 1 stiridecluj.ro, 1 +stirling.co, 1 stirlingpoon.com, 1 stirringphoto.com, 1 stisidores.org, 1 @@ -139070,7 +138930,6 @@ storytel.pl, 1 storytell.com, 1 storytellingforbusiness.com.au, 1 storytellingsales.com, 1 -stotranidhi.com, 1 stoumann.dk, 1 stourstreet.com, 1 stouter.nl, 1 @@ -139517,12 +139376,10 @@ studentclearinghouse.info, 1 studentclearinghouse.net, 1 studentclearinghouse.org, 1 studentclearinghouse.site, 1 -studentdebil.com, 1 studentenplaza.tk, 1 studentenwerk.sh, 1 studentenwoordenboek.nl, 1 studenterguiden.dk, 1 -studentforums.biz, 1 studenti.tk, 1 studentinaneta.com, 1 studentite.bg, 1 @@ -140152,6 +140009,7 @@ sunburstdata.com, 1 sunbusinessnetwork.org, 1 sunby.jp, 1 sunby.org, 1 +suncanakolica.eu, 1 suncanary.tk, 1 suncat.tk, 1 sunchild.ml, 1 @@ -140264,6 +140122,7 @@ sunshinefrontier.tk, 1 sunshinelife.tk, 1 sunshinereporting.com, 1 sunshinerequest.com, 1 +sunshinetradingco.com, 0 sunskyview.com, 1 sunsmartnsw.com.au, 1 sunsong.org, 1 @@ -140280,7 +140139,6 @@ sunsunjewellery.com, 1 sunsunjewelry.com, 1 sunsunjewelry.net, 1 sunsunjewelry.org, 1 -sunsystem-speicher.de, 1 suntechnologies.com, 1 sunticschool.org, 1 suntropez-shop.it, 1 @@ -140574,13 +140432,13 @@ surfbluewave.com, 1 surfduck.cfd, 0 surfduck.club, 0 surfduck.co, 1 -surfduck.link, 0 +surfduck.link, 1 surfduck.me, 0 -surfduck.xyz, 0 +surfduck.xyz, 1 surfenergy.tk, 1 surfersconnect.net, 1 surfinglisbon.com, 1 -surfingshare.com, 1 +surfingshare.com, 0 surfkath.de, 1 surflessonslisbon.com, 1 surfly.com, 1 @@ -140715,7 +140573,6 @@ sutherlandglobal.com, 1 sutherlinoregon.gov, 1 sutinenmatthews.tk, 1 sutmar-anwaltskanzlei.de, 1 -sutor-trauerbegleitung.de, 1 sutore.com, 1 sutron.com, 1 suttacentral.net, 1 @@ -140886,6 +140743,7 @@ svse.global, 1 svseglobal.com, 1 svsewerut.gov, 1 svswebmarketing.com, 1 +svtemplemn.org, 1 svtl.ch, 1 svtr.de, 1 svtv.org, 1 @@ -140975,7 +140833,6 @@ sweep-staging.com, 0 sweep.net, 0 sweeppeasweeps.com, 1 sweering.com, 1 -sweers.ch, 1 sweet-spatula.com, 0 sweet64.fr, 1 sweetair.com, 1 @@ -141499,7 +141356,7 @@ szablinski.pl, 1 szadeczky.com, 1 szafadziecka.com.pl, 1 szafkirtv.pl, 1 -szakszervezet.work, 0 +szakszervezet.work, 1 szalaiterko.hu, 1 szamitogepdepo.com, 1 szamlarobot.hu, 1 @@ -141664,7 +141521,6 @@ t9728.co, 1 ta-da.ua, 1 ta-hiroshi.jp, 1 ta-maison.fr, 1 -ta-nehisicoates.com, 1 ta-server.nl, 1 ta-soest.nl, 0 ta3.sk, 1 @@ -141674,6 +141530,7 @@ taanishsaifu.gq, 1 taapk.com, 1 taartbesteld.nl, 1 taartenvankoenie.tk, 1 +taartenvanmireille.nl, 1 taartenvanthea.nl, 1 taat.edu.ee, 1 taav.com, 1 @@ -141739,6 +141596,7 @@ tabu-bodywear.ch, 1 tabular.tools, 1 tabulartools.com, 1 tabulex.dk, 1 +tabunkatraining.com, 0 taburetka.ua, 1 tac-performance.net, 1 tac-sys.net, 1 @@ -143873,6 +143731,7 @@ tenantacademy.co.za, 1 tenantcloud.com, 1 tenantoptions.com.au, 1 tenanttraining.co.za, 1 +tenarya.com, 1 tenber.ge, 1 tenberg.com, 1 tencent.xn--vuq861b, 1 @@ -144726,7 +144585,6 @@ thebabelog.ga, 1 thebabelog.gq, 1 thebabiest.com, 1 thebabypassport.com, 1 -thebackdoor.co.za, 1 thebacksplashcompany.com, 1 thebackstage.tk, 1 thebacteriafight.gq, 1 @@ -145003,7 +144861,6 @@ thedarkfusion.tk, 1 thedarksidesoftwaresecurity.ga, 1 thedarkteam.tk, 1 thedatacity.com, 1 -thedave.link, 1 thedave.me, 1 thedave.photos, 1 thedawningofdarkness.tk, 1 @@ -145607,7 +145464,6 @@ theorchestranow.com, 1 theorchestranow.org, 1 theorganicrecycler.com, 1 theorganist.org, 1 -theoriecheck.de, 1 theoriginalassistant.com, 1 theoriginalcandid.com, 1 theoriginalmarkz.com, 1 @@ -146554,7 +146410,6 @@ thuiswinkel.org, 1 thumbnail-download.com, 1 thumbnails.jp, 1 thumbsupcandy.com, 1 -thumbtack.com, 1 thumbzilla.com, 1 thummer.net, 1 thunderbase.tk, 1 @@ -146948,6 +146803,7 @@ time.lk, 1 time.ly, 1 time.sh, 1 time2060.ru, 1 +time2choose.com, 1 timeai.io, 1 timebomb.tk, 1 timebookings.cf, 1 @@ -148037,7 +147893,7 @@ tooncastle.tk, 1 toondah.com.au, 1 toondahjobs.com.au, 1 toondergroup.com, 1 -toonetcreation.com, 1 +toonetcreation.com, 0 toonict.nl, 0 toonmate.tk, 1 toonpool.com, 1 @@ -148523,7 +148379,6 @@ totsglobal.com, 1 tottalbattle.com, 1 tottoya.com, 1 totuus.sk, 1 -totvs.com, 1 toubkalexperience.com, 1 toucan-informatique.fr, 1 touch-up-net.com, 1 @@ -148620,7 +148475,6 @@ tousei.tokyo.jp, 1 toushi-return.xyz, 1 touslesdrivers.com, 1 touslesforums.tk, 1 -toussaint-romain.be, 1 tout-a-fait.fr, 1 tout-art.ch, 1 tout-vendre.com, 1 @@ -149153,7 +149007,7 @@ tradingcenter.it, 1 tradingcomputers.com, 1 tradingdeer.io, 1 tradingfacile.eu, 1 -tradingfuturos.es, 1 +tradingfuturos.es, 0 tradinghelper.be, 1 tradingsetupsreview.com, 1 tradingtag.ga, 1 @@ -149955,11 +149809,13 @@ trickey.io, 1 trickle.works, 1 trico-pigmentazione.it, 1 tricolortotal.tk, 1 +tricordmedia.ca, 1 tricotserragaucha.com.br, 1 tricountyathome.com, 1 tricountybank.com, 1 tricountyhealthut.gov, 1 tricountyheatingcooling.com, 1 +triddybeads.com, 0 trident1000logoi.gr, 1 tridentaquatics.net, 1 tridentdiagnostics.com, 1 @@ -149997,7 +149853,6 @@ trillian.im, 1 trillian.media, 1 trillionaire.ca, 1 trilliondigital.io, 0 -trilliux.me, 1 trilogymp.com, 1 trim21.cn, 1 trimage.org, 1 @@ -150066,7 +149921,6 @@ triple-acoustics.de, 1 triple1.net, 1 triplebit.net, 1 triplebit.org, 1 -tripleblossom.com, 1 triplefork.com.ua, 1 triplekeys.net, 1 tripleone.co.uk, 1 @@ -150777,6 +150631,7 @@ tucsonfcu.com, 1 tucsonpcrepair.com, 1 tucsonsewerscopes.com, 1 tucuatro.com, 1 +tucuxi.org, 1 tudatosantejmentesen.hu, 1 tudatosdori.hu, 1 tudinerito.tk, 1 @@ -150802,7 +150657,6 @@ tuffsruffs.se, 1 tufitech.com, 1 tuflow.com, 1 tuftonboronh.gov, 1 -tugatech.com.pt, 1 tugedr.eu, 0 tugesha.com, 1 tugether.at, 1 @@ -150924,7 +150778,6 @@ tuomiset.com, 1 tuoni.ga, 1 tuotromedico.com, 1 tuotteet.org, 1 -tupass.pw, 1 tupatane.gq, 1 tuperiodico.soy, 1 tupeuxpastest.ch, 0 @@ -150949,7 +150802,6 @@ turanogluoptik.com, 1 turbaza.tk, 1 turbinadordigital.tk, 1 turbinaonline.tk, 1 -turbineaero.com, 1 turbinehq.com, 1 turbinelectricity.ga, 1 turbion.me, 1 @@ -151077,6 +150929,7 @@ turple.com, 1 turquoise.health, 1 turquoisetassel.com, 1 turretlabs.io, 1 +tursiae.org, 1 turtle.ai, 0 turtleduckstudios.com, 1 turtlehead.tk, 1 @@ -151577,7 +151430,6 @@ tyroremotes.pt, 1 tyroremotes.se, 1 tyrulez.tk, 1 tysabri.com, 0 -tysnes-holm.no, 1 tysonstelzer.com, 1 tysseminilager.no, 1 tysukakorrekt.ga, 1 @@ -151649,7 +151501,6 @@ u2hosting.net, 1 u2y.io, 1 u32i64.cf, 1 u36533.com, 1 -u4.re, 1 u5.re, 1 u51365.com, 1 u5197.co, 1 @@ -151823,7 +151674,6 @@ udeca.nom.es, 1 udeca.org, 1 udeca.org.es, 1 udeca.xyz, 1 -udemons.be, 1 udenit.de, 0 udenlandske-casinoer.dk, 1 udenlandskecasinoer.dk, 1 @@ -152345,7 +152195,6 @@ ungrafakta.gq, 1 ungrafakta.tk, 1 unhabitat.org, 1 unhappy.tk, 1 -unhub.ru, 1 uni-arts.com, 1 uni-chem.rs, 1 uni-cleaner.com, 1 @@ -152858,7 +152707,7 @@ upgradeloans.com, 1 upgrades-and-options.com, 1 upgraid.ru, 1 upguard-team.com, 1 -upguard.com, 1 +upguard.com, 0 upguard.com.au, 1 upguard.in, 1 upguard.org, 1 @@ -152904,7 +152753,6 @@ uportal.tk, 1 uppercloud.cf, 1 upperglass.co.uk, 1 uppergroup.co.za, 1 -upperhunterlibraries.net.au, 1 upperinc.com, 1 upperskagittribe-nsn.gov, 1 uppfinnarenc.tk, 1 @@ -153090,7 +152938,6 @@ urgent-notice.ml, 1 urgentcaresouthaven.com, 1 urgrafix.com, 1 urikon.ch, 1 -urinow.com, 1 urion.com.br, 1 uriport.com, 1 uriports.com, 1 @@ -153254,6 +153101,7 @@ used255.xyz, 1 usedoilfieldhouses.com, 1 useful-thing.ru, 1 usefulinsight.com, 1 +usefultravelsite.com, 1 useguestlist.com, 1 usehalo.com, 1 useinsider.com, 1 @@ -153582,7 +153430,6 @@ v-media.tk, 1 v-news.tk, 1 v-novosibirske.tk, 1 v-phoenix.tk, 1 -v-plus.ru, 1 v-spin.cz, 1 v-tek.fi, 1 v-zone.org, 1 @@ -153950,6 +153797,7 @@ van-eijsden.nl, 1 van-rutten.nl, 1 van.ddns.net, 0 van11y.net, 1 +vanadrighem.eu, 1 vanafhier.nl, 0 vanamersfoortracing.nl, 1 vananservices.com, 1 @@ -154428,7 +154276,6 @@ vehicleinfozone.com, 1 vehiclematsuk.com, 0 vehicletax.service.gov.uk, 1 vehimmo.com, 1 -vei.st, 1 veidiheimar.is, 1 veikkosimpanen.fi, 1 veiligesmartcities.nl, 1 @@ -154663,7 +154510,6 @@ verakoubova.net, 1 veraltis.ro, 1 veralytix.com, 1 veramagazine.jp, 0 -veramark.cl, 1 verandering-berlin.de, 1 veranovivo.com, 1 veransadigital.com, 1 @@ -154910,7 +154756,6 @@ vertretungsplan.io, 1 vertrieb-strategie.de, 1 vertrouwenspiegel.nl, 1 vertx.cc, 1 -verumwomen.com, 1 verusmedya.com, 1 verustracking.com, 1 veruvis.com, 1 @@ -154951,7 +154796,6 @@ vesmirmy.cz, 1 vesna2011.tk, 1 vespacascadia.com, 1 vespe.it, 1 -vesseldove.com, 1 vesselportal.com, 1 vessentys.com, 1 vessurvey.com, 1 @@ -155428,7 +155272,6 @@ viewing.nyc, 1 viewjobs.com.au, 1 viewpointsfromfacebook.com, 1 views4you.com, 1 -viewsea.com, 1 viewstub.com, 1 viez.vn, 1 vifranco.cl, 1 @@ -155640,7 +155483,6 @@ villagevetcattery.co.uk, 1 villagockel.de, 1 villahistoria.ml, 1 villainsclothing.com.au, 1 -villakarma.at, 1 villakiralik.com, 1 villalmanzo.tk, 1 villamenty.com, 1 @@ -155662,6 +155504,7 @@ villaville.com, 1 villawirz.it, 1 ville-gennevilliers.fr, 1 ville-ideale.fr, 1 +ville-mayenne.fr, 1 ville-nesle.fr, 1 ville-rognes.fr, 1 ville-saintemarguerite.fr, 1 @@ -156509,7 +156352,6 @@ vm0.eu, 1 vm88.top, 0 vmagadane.tk, 1 vmath.my.id, 1 -vmautorajkot.com, 1 vmc-installation-entretien.fr, 1 vmc.co.id, 1 vmccnc.com, 1 @@ -156631,7 +156473,7 @@ vogelwereld.tk, 1 vogler.name, 1 vogt.sh, 1 vogue.co.uk, 1 -vogue.cz, 1 +vogue.cz, 0 vogue.gr, 1 vogue.ph, 1 voguefabricsstore.com, 1 @@ -157356,7 +157198,6 @@ vrtemptation.com, 1 vrtidaho.gov, 1 vrtouring.org, 1 vrtuoluo.com, 1 -vrumcar.com, 1 vrzas.net, 1 vrzl.pro, 1 vs603.com, 1 @@ -157497,7 +157338,6 @@ vusdigital.com, 0 vuse.com, 1 vutrox.com, 1 vutruso.com, 0 -vuurspuwer.com, 1 vux.li, 1 vuzi.fr, 1 vuzopedia.ru, 1 @@ -158147,6 +157987,7 @@ wartorngalaxy.com, 1 wartraining.com.br, 1 wartung.tk, 1 warubbermate.co.th, 1 +warungmini-vanwou.nl, 1 warwick.institute, 1 warwickbucks.gov, 1 warworld.ml, 1 @@ -158339,7 +158180,6 @@ watisleukemie.tk, 1 watismijnbandenspanning.nl, 1 watmar.com.au, 1 watnongpangtru.com, 1 -watobi.jp, 1 watongaok.gov, 1 watoo.tech, 1 watrd.com, 1 @@ -158453,7 +158293,6 @@ wbmonitor.eu, 1 wbnet.eu, 1 wboeijen.nl, 1 wbolt.com, 1 -wbookcompany.com, 1 wbpersonalmonitor.de, 1 wbpgroup.com.au, 1 wbphed.gov.in, 1 @@ -158550,7 +158389,6 @@ wealthsimple.com, 1 wealthx.com, 1 wear-largesizes.tk, 1 wear-referrals.co.uk, 1 -wear.hk, 1 wear1015.ml, 1 wearandcare.net, 1 weare.ie, 1 @@ -158815,7 +158653,6 @@ webelement.sk, 0 webemployed.com, 1 webencrypt.org, 1 webengage.com, 1 -weber-immobilienberatung.de, 1 weber.com, 1 weber911.gov, 1 webera.lt, 1 @@ -159394,7 +159231,7 @@ wellnesscreatives.com, 1 wellnessmassage-eitorf.de, 1 wellnesstravelhub.com, 1 welloffpodcast.ca, 1 -wellpaid.hu, 0 +wellpaid.hu, 1 wellreceived.com, 1 wellsbourne.co.uk, 1 wellsburgwvpd.gov, 1 @@ -160708,7 +160545,6 @@ windycitypressurewashing.com, 1 wine-route.net, 1 wine.com.my, 1 wine.my, 1 -wineandcheeseplace.com, 1 winebrasil.com.br, 1 winechapter.be, 1 winedineunwind.org, 1 @@ -160716,13 +160552,12 @@ wineexperience.com.au, 1 wineforhelp.cz, 1 winefortune.com, 1 winegadgets.ru, 0 +winehouse.com, 1 winek.tk, 1 winenews.it, 1 wineparis.com, 1 winerytoursanfrancisco.com, 1 winetable.se, 1 -winewisegreenwich.com, 1 -wineworksonline.com, 1 winfieldchen.me, 1 winfieldpa.gov, 1 winfieldtownshipmi.gov, 1 @@ -161345,7 +161180,6 @@ wood-dental.jp, 1 wood4heat.ca, 1 woodandshop.com, 1 woodbornekitchens.com, 1 -woodbridgefurniture.com, 1 woodbridgegrp.com, 1 woodbridgepacific.com, 1 woodbury.io, 1 @@ -161798,7 +161632,6 @@ wowlegacy.ml, 1 wowlifedesignandco.jp, 1 wowlove.tk, 1 wownskportal.tk, 1 -wowowow.com, 1 wowpilates.com, 1 wowra.net.pl, 1 wows-mods.tk, 1 @@ -162458,7 +162291,6 @@ x9728.co, 1 x98v.com, 1 x98y.com, 1 xa.search.yahoo.com, 0 -xaasid.com, 1 xab199.com, 1 xaba.tk, 1 xabifk.com, 1 @@ -162699,7 +162531,6 @@ xer0x.in, 1 xerbisworks.com, 1 xerdeso.tk, 1 xerezdeportivo.tk, 1 -xerkus.pro, 1 xerownia.eu, 1 xertainty.com, 1 xertainty.de, 1 @@ -163171,7 +163002,6 @@ xn--80aejhvi0at.xn--90ais, 1 xn--80aejljbfwxn.xn--p1ai, 1 xn--80affa6ai0a.tk, 1 xn--80afvgfgb0aa.xn--p1ai, 1 -xn--80ahclcaoccacrhfebi0dcn5c1jh.xn--p1ai, 1 xn--80ahcnkhbwik.xn--p1ai, 1 xn--80ahjdhy.tk, 1 xn--80ahmohdapg.xn--80asehdb, 1 @@ -163267,7 +163097,6 @@ xn--c5wy5c025b.cn, 1 xn--c5wy5c025b.xn--fiqs8s, 1 xn--c5wy5c025b.xn--fiqz9s, 1 xn--carlshamnsvxtrike-0qb.se, 1 -xn--cartofidelidade-nkb.online, 1 xn--cck4ax91r.com, 1 xn--cck7f515h.com, 1 xn--cckdrt0kwb4g3cnh.com, 1 @@ -163579,7 +163408,6 @@ xn--ukys-f6a.lt, 1 xn--underux-0za.eu, 1 xn--urgencesolidarit-qqb.com, 1 xn--urgencesolidarit-qqb.fr, 1 -xn--uxqy9syyb.com, 1 xn--v-wfa35g.ro, 1 xn--v4q.ml, 1 xn--v6q426ishax2a.xyz, 1 @@ -163702,7 +163530,6 @@ xpertcenter.ch, 0 xpertcube.com, 1 xpertgears.com, 1 xpertmedia.ro, 1 -xpertva.com, 1 xpetit.net, 1 xpg.jp, 1 xphelper.tk, 1 @@ -163729,7 +163556,6 @@ xpsauto.com, 1 xpsautomation.com, 1 xpsfactory.com, 1 xpsinnovation.com, 1 -xpsnow.net, 1 xpsrobotics.com, 1 xptrack.com, 1 xptrackstaging.com, 1 @@ -164417,7 +164243,7 @@ ybresson.com, 1 ybrfrance.fr, 1 ybscareers.co.uk, 1 ybsj.net, 1 -ybti.net, 1 +ybti.net, 0 ybug.io, 1 ybvip789.com, 0 ybzhao.com, 1 @@ -164443,7 +164269,6 @@ ydr.me, 1 ydsbookstore.com, 1 ydskursuankara.net, 1 ydspublishing.com, 1 -ydt.am, 1 ydyy99.com, 1 ydyydy.ml, 1 yeadonboroughpa.gov, 1 @@ -164619,7 +164444,6 @@ yiai.ga, 1 yiai.gq, 1 yiai.ml, 1 yiai.tk, 1 -yianniswine.com, 1 yiannopoulos.edu.gr, 1 yibaoweilong.top, 1 yibin0831.com, 0 @@ -164820,7 +164644,6 @@ yoogirls.com, 1 yoonas.com, 1 yooneunhye.com, 0 yooooex.com, 1 -yoopies.fr, 1 yopers.com, 0 yopmail.com, 1 yopmail.net, 1 @@ -164993,7 +164816,6 @@ your28days.com, 1 youran.me, 1 yourantiquarian.com, 1 youraudiobooks.xyz, 1 -yourazbraces.com, 0 yourbenefitsresources.com, 1 yourberksbucksoxon.wedding, 1 yourbittorrent.com, 1 @@ -165346,7 +165168,6 @@ yunloc.com, 1 yunqueradehenares.tk, 1 yunzhu.li, 1 yuplay.com, 1 -yupulse.be, 1 yuqi.me, 1 yuquepay.com, 1 yura.cf, 1 @@ -165685,7 +165506,6 @@ zakr.es, 1 zakratheme.com, 1 zakrentus-ostrus.space, 1 zakspartiesandevents.com, 1 -zakutka.com, 0 zala.ml, 1 zalaetavoleibol.tk, 1 zalan.do, 1 @@ -165732,6 +165552,7 @@ zangerwillem.tk, 1 zango.com.au, 1 zanica.co.nz, 1 zankevich.com, 0 +zankevich.net, 1 zanotti.io, 1 zanquan.net, 1 zanshin-sailing.com, 1 @@ -166130,7 +165951,6 @@ zenvate.com.au, 1 zenvia.com, 1 zenvideocloud.com, 1 zenvite.com, 1 -zenways.io, 1 zeocax.com, 1 zep.us, 0 zephyr-cloud.io, 1 @@ -166992,7 +166812,6 @@ zuefle.net, 1 zuehlcke.de, 1 zufuribita.tk, 1 zug-anwalt.de, 0 -zugarkovi.cz, 1 zuhausejobs.com, 1 zuhauserealestate.com, 1 zuhur2021.tk, 1 @@ -167067,7 +166886,6 @@ zwedenautohuur.nl, 1 zwemclub-rob.nl, 0 zwemschooldezwaantjes.tk, 1 zwergenfeste.ch, 1 -zwergenfreiheit.at, 1 zwerimex.com, 1 zwhblog.xyz, 0 zwickau.de, 1 @@ -167127,7 +166945,6 @@ zyminex.com, 1 zymmm.com, 1 zyner.org, 1 zynga.com, 1 -zyno.space, 1 zynqit.com, 0 zypern-und-ich.de, 1 zypernreisen.com, 1 diff --git a/security/manager/tools/log_list.json b/security/manager/tools/log_list.json @@ -1,6 +1,6 @@ { - "version": "77.2", - "log_list_timestamp": "2025-12-03T12:54:26Z", + "version": "77.6", + "log_list_timestamp": "2025-12-07T12:52:59Z", "operators": [ { "name": "Google", diff --git a/services/settings/dumps/blocklists/addons-bloomfilters.json b/services/settings/dumps/blocklists/addons-bloomfilters.json @@ -5,6 +5,488 @@ "blocked": [], "unblocked": [], "softblocked": [ + "shareyt-extension@shareyt.com:0.0.0", + "shareyt-extension@shareyt.com:0.0.2", + "shareyt-extension@shareyt.com:0.0.3", + "firefox@thisisdaan.com:1.0", + "firefox@thisisdaan.com:1.1", + "{28a13fdc-e57a-44be-b396-bd3ea6c716f1}:2.5.1" + ] + }, + "schema": 1765154189262, + "key_format": "{guid}:{version}", + "stash_time": 1765175707050, + "id": "cb290eb1-4652-4422-9788-163b346a4675", + "last_modified": 1765175799062 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{43082f9f-0ef5-4a33-8846-846c3a06eb0c}:1.0", + "{43082f9f-0ef5-4a33-8846-846c3a06eb0c}:1.1", + "{c62b66fe-a3c6-4423-b84d-9b9796a80a15}:1.0", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.0.5.5", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.0.6.6", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.6", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.7", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.8", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.0", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.3", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.9", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:2.0", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:0.3", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:0.4", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:0.5", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.2.2", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.1", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.2", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.3", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.4", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.5", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.6", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.7", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.8", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.3.9", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.4.0", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.1.4.1", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.0", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.1", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.2", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.3", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.4", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.5", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.6", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.7", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.2.2.8", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.3.3.5", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.3.3.8", + "{9a41dca9-1a2e-44f9-9344-9ac479d1f738}:1.5.1a", + "{6fbd309d-cae0-483d-becf-0da3088b2d16}:1.2", + "{6fbd309d-cae0-483d-becf-0da3088b2d16}:1.2.2.0", + "{6fbd309d-cae0-483d-becf-0da3088b2d16}:1.5.1a", + "{6fbd309d-cae0-483d-becf-0da3088b2d16}:1.5.1.1a", + "{6fbd309d-cae0-483d-becf-0da3088b2d16}:1.5.1.2a", + "{f388c187-4d82-4653-bf67-2c22328c1bca}:2.2.4" + ] + }, + "schema": 1765132590414, + "key_format": "{guid}:{version}", + "stash_time": 1765154106165, + "id": "6374ac96-f821-467a-9a06-d2c4d184055f", + "last_modified": 1765154189071 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "favory@sp4ce.pw:1.2.2", + "favory@sp4ce.pw:1.2.3", + "gemini-prekladac-vlastni@localhost:1.0", + "{9fdfdf7d-6502-480c-8047-d01488edf8a0}:1.0.0", + "visilant-beta@xcoder.non-existant-domain.com:1.1.0", + "{e1115949-b669-4cdc-ac1f-326ddb3c7234}:1.0", + "{9088d870-3a33-4c22-8662-36047b66f8bc}:1.0.0", + "{4da1ec58-57c2-4c45-8c39-3b6c027ee944}:1.0.0" + ] + }, + "schema": 1765110987552, + "key_format": "{guid}:{version}", + "stash_time": 1765132506415, + "id": "80bca371-fc6e-4c9b-b880-4853d18d1e7e", + "last_modified": 1765132590103 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{03a90996-1a80-4372-b8c0-6ff5139cad5f}:1.0", + "internetbilltrackerpro@example.com:1.0.0", + "@antibanner:3.5", + "@antibanner:4.0", + "@antibanner:4.0.1", + "randyfrey@tutanota.com:1.0", + "randyfrey@tutanota.com:1.0.4", + "m3u8-sniffer@firefox.addon:1.0.0", + "{d4b72db7-67f0-4e8c-be7d-4ea7038b9687}:1.0", + "filejo_fixer_custom@example.com:1.11", + "mailinfo.ir@gmail.com:1.2", + "{e4e5d47a-49a7-11ee-be56-0242ac120002}:1.0.7", + "{fd3bb385-9595-49a0-9c21-0cf9b9172a4e}:1.0", + "favory@sp4ce.pw:1.1.7", + "favory@sp4ce.pw:1.1.8", + "favory@sp4ce.pw:1.1.9", + "favory@sp4ce.pw:1.2.0", + "favory@sp4ce.pw:1.2.1" + ] + }, + "schema": 1765089389032, + "key_format": "{guid}:{version}", + "stash_time": 1765110906454, + "id": "73f05753-074e-42c8-9a1b-621a501a23c3", + "last_modified": 1765110987297 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "randyfrey@tutanota.com:1.0.1", + "randyfrey@tutanota.com:1.0.3", + "teledown@example.com:1.0", + "ghostrabbit-security@example.com:3.1", + "{b4957d77-f4e9-4052-8f7d-5c79e3256b6a}:1.0", + "{b4957d77-f4e9-4052-8f7d-5c79e3256b6a}:2.0" + ] + }, + "schema": 1765067779534, + "key_format": "{guid}:{version}", + "stash_time": 1765089306158, + "id": "d83dc55e-c998-46fb-8d78-bd2e2a32057e", + "last_modified": 1765089388782 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "tabby@momo.com:0.1", + "stockmanager@gmx.de:2025.1005", + "{a8d3b00b-c781-4009-aa19-9004ff3adfef}:1.3", + "formatter@cryptohelper:1.4", + "{c79821b7-13c3-4ea3-acee-057de14918f4}:1.0", + "{72f793ac-57fb-4cb1-b5f1-287a89dba20c}:7.5", + "{6ab1a57b-2b1c-4c8f-a397-49ce2937d723}:4.62", + "{022879aa-58fb-4579-8b17-4cd2df9dc805}:1.0", + "vod-tracker2@example.com:1.0", + "vod-tracker@example.com:1.0" + ] + }, + "schema": 1765046194777, + "key_format": "{guid}:{version}", + "stash_time": 1765067705046, + "id": "cef139ea-5b61-4b14-a95c-aef219f7a394", + "last_modified": 1765067779343 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.2.1206", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.0.1206", + "{0b6f6349-25fd-4258-be80-696547cd0894}:20251205.1833", + "audio-effects@studio.extension:1.0.0", + "audio-effects@studio.extension:1.0.2", + "audio-effects@studio.extension:1.0.4", + "audio-effects@studio.extension:1.1.2", + "focus-time-blocker-tempo@extension.dev:2.0.0", + "erp-sales-analysis@example.com:1.4.2", + "{11cfd46d-f1de-465f-85ba-a59078bf9869}:1.2.1", + "{11cfd46d-f1de-465f-85ba-a59078bf9869}:1.2" + ] + }, + "schema": 1765024589417, + "key_format": "{guid}:{version}", + "stash_time": 1765046106134, + "id": "bae3a5f7-0267-4341-86f1-dffb9bfe8a4e", + "last_modified": 1765046194594 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{df5aec55-4e29-46ac-a1e1-c247d8bb3e12}:1.0", + "tipple@youngryan.com:0.1", + "re-start-custom@yourdomain.com:1.3.5", + "re-start-custom@yourdomain.com:1.3.6", + "re-start-custom@yourdomain.com:1.3.7", + "re-start-custom@yourdomain.com:1.3.8", + "re-start-custom@yourdomain.com:1.3.9", + "re-start-custom@yourdomain.com:1.3.10", + "SmartClip@Smitis:1.0.1", + "SmartClip@Smitis:1.0.21.0", + "SmartClip@Smitis:1.0.22.4", + "SmartClip@Smitis:1.0.24.0", + "SmartClip@Smitis:1.0.24.1", + "SmartClip@Smitis:1.0.24.2", + "SmartClip@Smitis:1.0.24.3", + "SmartClip@Smitis:1.0.24.5", + "SmartClip@Smitis:1.0.24.6", + "SmartClip@Smitis:1.0.24.7", + "SmartClip@Smitis:1.0.24.9", + "SmartClip@Smitis:1.0.25.0", + "SmartClip@Smitis:1.0.26.0" + ] + }, + "schema": 1765002994320, + "key_format": "{guid}:{version}", + "stash_time": 1765024506422, + "id": "a96f39da-ec9f-4047-9707-e88e0f04c2f6", + "last_modified": 1765024589298 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "zen-chatgpt-launcher@example.com:1.0", + "zen-chatgpt-launcher@example.com:1.1", + "zen-chatgpt-launcher@example.com:1.2", + "szczypi@hotmail.com:3.2", + "purple-monocle-beta@firefoxplugin:0.1.64", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.14.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.19.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.20.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.21.1204", + "mr.iramis@gmail.com:0.1.0" + ] + }, + "schema": 1764981396412, + "key_format": "{guid}:{version}", + "stash_time": 1765002906493, + "id": "a8a006c4-fabf-4100-bacc-d7d21f928351", + "last_modified": 1765002994100 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{2b38446a-b241-49fb-8e9f-04634d22648e}:1.0", + "{03ed4fb9-7f01-4d74-82f3-028f35ba387a}:1.0", + "{5e9633f7-6af1-4213-a708-b73089c94a58}:1.0", + "{f79501c1-65fb-4a8a-adca-3ce247fb2cf7}:1.0", + "{dc481bd6-df4d-4015-9357-14a07f093d24}:1.0", + "{76a937c3-44db-44ae-ad2d-4235d826090a}:1.0", + "{8b33efa8-81c2-4495-b6c2-133194a457d2}:1.0", + "{363573fc-7fc7-4e3e-bff8-0bf179358903}:1.0", + "vl-notifier@local:1.0.1", + "vl-notifier@local:1.0.2", + "vl-notifier@local:1.0.3", + "loginoverlayblocker@dev.fr:1.3", + "loginoverlayblocker@dev.fr:1.4resigned1", + "{e0b3c89e-ac95-4ef7-abad-e00f5aeb1906}:1.0", + "{12345678-1234-1234-432A-123456789aba}:1.0", + "{fec14abb-864c-4d13-9d1d-bce43ec8ca4f}:1.0.0", + "{fec14abb-864c-4d13-9d1d-bce43ec8ca4f}:1.0.1" + ] + }, + "schema": 1764959790917, + "key_format": "{guid}:{version}", + "stash_time": 1764981307235, + "id": "e732864b-5568-4e1c-8979-05329ccd4e26", + "last_modified": 1764981396160 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{1477aae4-5e27-4008-aaf4-243294f7b41d}:1.8.1", + "labs@promptmarketcap.com:1.0.10", + "{5b301532-45b7-4836-955e-560fdaee947b}:1.1", + "{5b301532-45b7-4836-955e-560fdaee947b}:1.2", + "gitlab-tools@lequipe.fr:1.0", + "gitlab-tools@lequipe.fr:1.1", + "gitlab-tools@lequipe.fr:1.2", + "gitlab-tools@lequipe.fr:1.3", + "gitlab-tools@lequipe.fr:1.4", + "gitlab-tools@lequipe.fr:1.5", + "kagi-sidebar@your-unique-name.com:4.0", + "magnoliaAS@12.34:4.2.6.3", + "magnolie@12.34:4.2.6.3", + "password-manager@extension.com:1.0.0", + "{5d77c7a5-ee1b-4068-b15d-e23224533775}:2.3.6" + ] + }, + "schema": 1764938194052, + "key_format": "{guid}:{version}", + "stash_time": 1764959706296, + "id": "64e3afde-4299-44c0-ab73-3c5c0734186c", + "last_modified": 1764959790637 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{f99128d2-2503-405e-a5c8-02d36abf9540}:12.2.2.2", + "{f99128d2-2503-405e-a5c8-02d36abf9540}:12.2.2.1", + "{f99128d2-2503-405e-a5c8-02d36abf9540}:12.2.2", + "{e6fd26f2-5737-4258-a3b5-e7061cb28d0d}:12.1.6", + "@chaturbate:2.41", + "@chaturbate:2.42", + "@chaturbate:2.44", + "sab-ffx-ext@zpowerbot.com:2.2", + "{9bad2d38-013f-47bf-8237-d270e5d41216}:1.0", + "{9bad2d38-013f-47bf-8237-d270e5d41216}:1.1", + "{9bad2d38-013f-47bf-8237-d270e5d41216}:1.2", + "{9bad2d38-013f-47bf-8237-d270e5d41216}:1.3", + "4ChanDL@example.com:1.0", + "4ChanDL@example.com:1.1", + "{39999d6d-30ac-4aa5-9aa8-181bdfecc5f3}:0.1", + "{39999d6d-30ac-4aa5-9aa8-181bdfecc5f3}:0.2", + "{39999d6d-30ac-4aa5-9aa8-181bdfecc5f3}:0.3", + "sysinfo@pivdenny.ua:1.0", + "my-startup-groups@example.com:1.0" + ] + }, + "schema": 1764916591437, + "key_format": "{guid}:{version}", + "stash_time": 1764938106290, + "id": "0ab23f34-ea09-4f1f-b257-462905b31ad3", + "last_modified": 1764938193841 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "sidebrain@example.com:1.0.4", + "ensek-azure-helper@example.com:1.0.0", + "bnjphnhongclfcjiokiffmbhnenjkhea@CWS_CRXInstaller:25.3.1.25", + "@RingCXforHubSpot-.ccope:25.3.1.25", + "test824u8@example.com:8.2.4", + "test824u80@example.com:8.2.4", + "test824u81@example.com:8.2.4", + "test824u82@example.com:8.2.4", + "Android@bravenhancer.com:20.5.0", + "enhancer@goldenfox.com:20.5.0", + "test824u83@example.com:8.2.4", + "btbattery@example.org:1.4.5", + "btbattery@example.org:1.4.7", + "btbattery@example.org:1.5.0", + "btbattery@example.org:1.5.1", + "simpleshot@secondversion.com:1.0", + "simpleshot@secondversion.com:2.0" + ] + }, + "schema": 1764900945824, + "key_format": "{guid}:{version}", + "stash_time": 1764916506221, + "id": "277c5d65-8103-42f6-8620-cd8ce733a37c", + "last_modified": 1764916591246 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "fertilis.ai@gmail.com:0.0.2", + "{9b8f61dc-6d4b-4282-8258-d44e83843b89}:1.0", + "{9602dbf1-2ceb-4c10-91ff-5cf23e97daf3}:1.0", + "{9602dbf1-2ceb-4c10-91ff-5cf23e97daf3}:2.0", + "{9602dbf1-2ceb-4c10-91ff-5cf23e97daf3}:3.0", + "{9602dbf1-2ceb-4c10-91ff-5cf23e97daf3}:4.0", + "{9602dbf1-2ceb-4c10-91ff-5cf23e97daf3}:5.0", + "{9602dbf1-2ceb-4c10-91ff-5cf23e97daf3}:6.0", + "{d085a167-cb13-4ff5-bf3b-7afda63aeefd}:1.0", + "{49f467c2-496d-4415-be8f-65b3a01f34c2}:1.0", + "{3f8daeb6-e40b-4722-a388-2f4d6828b327}:1.0", + "{b208050e-1a94-4589-bc82-4907612bc1a6}:1.0", + "{552fe1a5-f125-4145-9f71-5357d0054751}:1.0", + "{2e616cf5-038c-41de-98c8-8eadd341d125}:1.0", + "{54f9e1cd-f44e-4946-b3ce-f3ce35f2d076}:1.0", + "{2fe8dd57-6044-4384-9a7d-322965cffcb4}:1.0", + "pera-algo-panel@peraalgo.dev:2.0.4", + "tangem-panel@tangem.dev:2.0.4" + ] + }, + "schema": 1764873392441, + "key_format": "{guid}:{version}", + "stash_time": 1764894906394, + "id": "2f1a454a-1324-499d-b555-2c52b533cdf4", + "last_modified": 1764894989455 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "noreply@renowify.lu:2.2", + "youtube-redirect@yourdomain.com:1.4", + "quiz-ai-helper@quiz-ai-helper.local:1.0.0", + "timetolockin@no.ai:1.0", + "{874f309e-fce3-40ba-a4cd-9e3b298d1dd8}:1.0", + "szczypi@hotmail.com:3.1.1", + "szczypi@hotmail.com:3.1", + "szczypi@hotmail.com:3.0.2", + "szczypi@hotmail.com:3.0.1", + "szczypi@hotmail.com:3.0", + "szczypi@hotmail.com:2.1", + "szczypi@hotmail.com:2.0", + "szczypi@hotmail.com:1.0", + "container-proxy-manager@your-domain.tld:1.0.0", + "stoptimers@admetricks.com:1.0", + "stoptimers@admetricks.com:1.1", + "stoptimers@admetricks.com:1.2", + "stoptimers@admetricks.com:1.3", + "ittcatcher@admetricks.com:1.0", + "paywall-remover-9000@sjoertjuh.dev:1.0.0", + "paywall-remover-9000@sjoertjuh.dev:1.0.1", + "calico-cats@extension:1.0.0", + "@ap-history-tracker:1.1", + "@ap-history-tracker:1.0" + ] + }, + "schema": 1764862094519, + "key_format": "{guid}:{version}", + "stash_time": 1764873307396, + "id": "aa62b81f-11da-4731-916e-644cdf296fab", + "last_modified": 1764873392181 + }, + { + "stash": { + "blocked": [ + "{7eef959d-570c-49bf-914d-52e3243165ca}:1.7", + "{1483d2bf-ee90-4dc0-ad65-684689cfcfc7}:4.0.133", + "{1483d2bf-ee90-4dc0-ad65-684689cfcfc7}:4.0.161", + "{ef34f2c9-f773-4beb-96ec-e532fc7f1738}:1.3.5" + ], + "unblocked": [], + "softblocked": [ + "btbattery@example.org:1.4.1", + "btbattery@example.org:1.4.2", + "{51cfd46d-f1de-465f-85ba-a59078bf9869}:2.0", + "{51cfd46d-f1de-465f-85ba-a59078bf9869}:2.1", + "{51cfd46d-f1de-465f-85ba-a59078bf9869}:2.2", + "{51cfd46d-f1de-465f-85ba-a59078bf9869}:2.3", + "{50cfd46d-f1de-465f-85ba-a59078bf9849}:1.1", + "addontest918@testexample.com:0.0.14", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.9.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.10.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.11.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.12.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.13.1204", + "btbattery@example.org:1.4.3", + "{7f3a9c2b-2222-4f1a-b5c6-9e2d1a8f4b70}:1.0.11", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.15.1204", + "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.17.1204", + "demo_cvs_riverop0@proton.me:1.2", + "Extractor_riverop0@proton.me:1.0", + "container-proxy-fork@local:0.2.0", + "{6ab1a57b-2b1c-4c8f-a397-49ce2937d723}:4.61", + "{764b10ae-d31a-40bd-a60b-14ff854dd3f7}:5.33" + ] + }, + "schema": 1764830190759, + "key_format": "{guid}:{version}", + "stash_time": 1764851705334, + "id": "8623238e-3774-4468-be5e-a52e68828584", + "last_modified": 1764851779519 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ "{261a39da-f913-4c73-b956-239559e3ad64}:1.0", "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.1.1203", "{dc5f5d17-0a0b-4576-b146-e92e5df164ac}:1.0.1204", @@ -5208,5 +5690,5 @@ "last_modified": 1761136764909 } ], - "timestamp": 1764830190557 + "timestamp": 1765175799062 } diff --git a/services/settings/dumps/main/devtools-compatibility-browsers.json b/services/settings/dumps/main/devtools-compatibility-browsers.json @@ -1,6 +1,168 @@ { "data": [ { + "name": "WebView Android", + "schema": 1764979505137, + "status": "planned", + "version": "146", + "browserid": "webview_android", + "id": "620f087d-d5c6-4b67-80f4-02358d8298e7", + "last_modified": 1765180094112 + }, + { + "name": "Opera Android", + "schema": 1764979504685, + "status": "current", + "version": "93", + "browserid": "opera_android", + "id": "d804ce23-825c-4e96-a0f4-c70981bb9a18", + "last_modified": 1765180094108 + }, + { + "name": "Chrome Android", + "schema": 1764979504231, + "status": "planned", + "version": "146", + "browserid": "chrome_android", + "id": "1b035778-10c7-4ea3-aeb4-3606fd3483e1", + "last_modified": 1765180094104 + }, + { + "name": "Edge", + "schema": 1764979504557, + "status": "planned", + "version": "146", + "browserid": "edge", + "id": "71070e67-3067-4271-acef-cf0bd7a4f555", + "last_modified": 1765180094101 + }, + { + "name": "Chrome", + "schema": 1764979503917, + "status": "planned", + "version": "146", + "browserid": "chrome", + "id": "b9100141-3b96-44f6-89b5-2dd19d6dfba6", + "last_modified": 1765180094097 + }, + { + "name": "Edge", + "schema": 1764979504497, + "status": "nightly", + "version": "145", + "browserid": "edge", + "id": "40684037-f3dc-4106-b1f7-91bd4fa18a32", + "last_modified": 1765180094092 + }, + { + "name": "WebView Android", + "schema": 1764979505076, + "status": "nightly", + "version": "145", + "browserid": "webview_android", + "id": "51da2d32-d596-43de-8dea-bb19b07b2bf0", + "last_modified": 1765180094085 + }, + { + "name": "Chrome", + "schema": 1764979503854, + "status": "nightly", + "version": "145", + "browserid": "chrome", + "id": "1bcd114b-13e9-428b-9d54-bd2d993aa5bb", + "last_modified": 1765180094082 + }, + { + "name": "Chrome Android", + "schema": 1764979504166, + "status": "nightly", + "version": "145", + "browserid": "chrome_android", + "id": "4363f23f-12a8-40d5-aedb-9c90514c368c", + "last_modified": 1765180094078 + }, + { + "name": "WebView Android", + "schema": 1764979505016, + "status": "beta", + "version": "144", + "browserid": "webview_android", + "id": "336a5fe9-5846-4e9d-9039-be3d1d82f97f", + "last_modified": 1765180094075 + }, + { + "name": "Chrome", + "schema": 1764979503790, + "status": "beta", + "version": "144", + "browserid": "chrome", + "id": "445d8b56-0300-4c6b-8e1f-0d1ab3f45500", + "last_modified": 1765180094071 + }, + { + "name": "Chrome Android", + "schema": 1764979504105, + "status": "beta", + "version": "144", + "browserid": "chrome_android", + "id": "196eb3bc-6b04-4a4e-875f-b46ff5d5e6da", + "last_modified": 1765180094068 + }, + { + "name": "Chrome", + "schema": 1764979503724, + "status": "current", + "version": "143", + "browserid": "chrome", + "id": "d18f46a3-d6bd-4291-8088-27feea84ca76", + "last_modified": 1765180094064 + }, + { + "name": "Samsung Internet", + "schema": 1764979504820, + "status": "current", + "version": "29.0", + "browserid": "samsunginternet_android", + "id": "c30b100b-baa9-418f-b196-11e2cc06c7ad", + "last_modified": 1765180094055 + }, + { + "name": "Edge", + "schema": 1764979504435, + "status": "beta", + "version": "144", + "browserid": "edge", + "id": "64945ca2-8c7c-4d04-8a37-dd304f2e93ce", + "last_modified": 1765180094052 + }, + { + "name": "Edge", + "schema": 1764979504368, + "status": "current", + "version": "143", + "browserid": "edge", + "id": "5fbdfe94-de4c-4bfe-b789-246f64a7f4b6", + "last_modified": 1765180094048 + }, + { + "name": "WebView Android", + "schema": 1764979504956, + "status": "current", + "version": "143", + "browserid": "webview_android", + "id": "c0345eaf-8f79-42e7-9d5d-a16f48e6761f", + "last_modified": 1765180094045 + }, + { + "name": "Chrome Android", + "schema": 1764979504045, + "status": "current", + "version": "143", + "browserid": "chrome_android", + "id": "88163a1b-c1ef-4699-a50e-bd33a32ea075", + "last_modified": 1765180094041 + }, + { "name": "Node.js", "schema": 1764115503977, "status": "current", @@ -109,15 +271,6 @@ "last_modified": 1762424892974 }, { - "name": "Edge", - "schema": 1762387503671, - "status": "planned", - "version": "145", - "browserid": "edge", - "id": "40684037-f3dc-4106-b1f7-91bd4fa18a32", - "last_modified": 1762424892971 - }, - { "name": "WebView on iOS", "schema": 1762387504304, "status": "beta", @@ -136,24 +289,6 @@ "last_modified": 1762424892963 }, { - "name": "Edge", - "schema": 1762387503603, - "status": "nightly", - "version": "144", - "browserid": "edge", - "id": "64945ca2-8c7c-4d04-8a37-dd304f2e93ce", - "last_modified": 1762424892958 - }, - { - "name": "Edge", - "schema": 1762387503533, - "status": "beta", - "version": "143", - "browserid": "edge", - "id": "5fbdfe94-de4c-4bfe-b789-246f64a7f4b6", - "last_modified": 1762424892954 - }, - { "name": "Opera", "schema": 1761955503193, "status": "beta", @@ -199,141 +334,6 @@ "last_modified": 1762424892932 }, { - "name": "Edge", - "schema": 1762387503452, - "status": "current", - "version": "142", - "browserid": "edge", - "id": "7d644a9d-4167-44d0-b58a-165beedf43e5", - "last_modified": 1762424892927 - }, - { - "name": "WebView Android", - "schema": 1761696314562, - "status": "planned", - "version": "145", - "browserid": "webview_android", - "id": "51da2d32-d596-43de-8dea-bb19b07b2bf0", - "last_modified": 1761724372878 - }, - { - "name": "Chrome", - "schema": 1761696313807, - "status": "planned", - "version": "145", - "browserid": "chrome", - "id": "1bcd114b-13e9-428b-9d54-bd2d993aa5bb", - "last_modified": 1761724372875 - }, - { - "name": "Chrome Android", - "schema": 1761696314122, - "status": "planned", - "version": "145", - "browserid": "chrome_android", - "id": "4363f23f-12a8-40d5-aedb-9c90514c368c", - "last_modified": 1761724372871 - }, - { - "name": "WebView Android", - "schema": 1761696314499, - "status": "nightly", - "version": "144", - "browserid": "webview_android", - "id": "336a5fe9-5846-4e9d-9039-be3d1d82f97f", - "last_modified": 1761724372867 - }, - { - "name": "Chrome", - "schema": 1761696313747, - "status": "nightly", - "version": "144", - "browserid": "chrome", - "id": "445d8b56-0300-4c6b-8e1f-0d1ab3f45500", - "last_modified": 1761724372864 - }, - { - "name": "Chrome Android", - "schema": 1761696314057, - "status": "nightly", - "version": "144", - "browserid": "chrome_android", - "id": "196eb3bc-6b04-4a4e-875f-b46ff5d5e6da", - "last_modified": 1761724372861 - }, - { - "name": "Chrome", - "schema": 1761696313690, - "status": "beta", - "version": "143", - "browserid": "chrome", - "id": "d18f46a3-d6bd-4291-8088-27feea84ca76", - "last_modified": 1761724372857 - }, - { - "name": "WebView Android", - "schema": 1761696314379, - "status": "current", - "version": "142", - "browserid": "webview_android", - "id": "d1917e2a-614b-4b6c-8bb4-683132e1fd64", - "last_modified": 1761724372851 - }, - { - "name": "Chrome", - "schema": 1761696313619, - "status": "current", - "version": "142", - "browserid": "chrome", - "id": "80f03197-a17b-4032-ba47-0e81e04ffce2", - "last_modified": 1761724372848 - }, - { - "name": "WebView Android", - "schema": 1761696314437, - "status": "beta", - "version": "143", - "browserid": "webview_android", - "id": "c0345eaf-8f79-42e7-9d5d-a16f48e6761f", - "last_modified": 1761724372841 - }, - { - "name": "Chrome Android", - "schema": 1761696313996, - "status": "beta", - "version": "143", - "browserid": "chrome_android", - "id": "88163a1b-c1ef-4699-a50e-bd33a32ea075", - "last_modified": 1761724372838 - }, - { - "name": "Chrome Android", - "schema": 1761696313933, - "status": "current", - "version": "142", - "browserid": "chrome_android", - "id": "0b5cf19b-6816-4a96-aeb8-de25f776b025", - "last_modified": 1761724372834 - }, - { - "name": "Opera Android", - "schema": 1760141104124, - "status": "current", - "version": "92", - "browserid": "opera_android", - "id": "2d5b3e9f-ae53-4833-adac-d2fdb3267611", - "last_modified": 1760336031485 - }, - { - "name": "Samsung Internet", - "schema": 1759889746802, - "status": "beta", - "version": "29.0", - "browserid": "samsunginternet_android", - "id": "c30b100b-baa9-418f-b196-11e2cc06c7ad", - "last_modified": 1759989898794 - }, - { "name": "Deno", "schema": 1759363503600, "status": "current", @@ -361,15 +361,6 @@ "last_modified": 1754642891013 }, { - "name": "Samsung Internet", - "schema": 1749254703179, - "status": "current", - "version": "28.0", - "browserid": "samsunginternet_android", - "id": "d85a7f04-256c-4b3c-a633-29d0b2a19f18", - "last_modified": 1749550693720 - }, - { "name": "Node.js", "schema": 1734480302872, "status": "esr", @@ -388,5 +379,5 @@ "last_modified": 1665656484764 } ], - "timestamp": 1764597259381 + "timestamp": 1765180094112 } diff --git a/services/settings/dumps/security-state/intermediates.json b/services/settings/dumps/security-state/intermediates.json @@ -3069,19 +3069,6 @@ "last_modified": 1748617022256 }, { - "schema": 1748613464898, - "derHash": "xrPG3kW8irklU2od8L7N6cQivhoGujkUJ1jB7MVYaA4=", - "attachment": { - "hash": "7838c760cb523cdd55efe81c53ee4c5a1ee9702379e1fdc610be0d4c52a1a332", - "size": 1999, - "filename": "LgbK4fwgsgDm-3SFV6RES-yTF9__LkFRZp4PeUTwqeA=.pem", - "location": "security-state-staging/intermediates/b6ca3b07-7c7f-41bf-8627-51e8624a2754.pem", - "mimetype": "application/x-pem-file" - }, - "id": "8535d081-5cb2-412d-8452-365fba55e282", - "last_modified": 1748617022249 - }, - { "schema": 1748570266149, "derHash": "QYuXFAxxBYoJ6TOwidDVaD4xM81fclSPbBWhdXm6J9s=", "attachment": { @@ -30643,5 +30630,5 @@ "last_modified": 1559865884636 } ], - "timestamp": 1764820622846 + "timestamp": 1764907022540 } diff --git a/servo/components/style/color/mix.rs b/servo/components/style/color/mix.rs @@ -252,43 +252,43 @@ impl AbsoluteColor { // Lightness L if matches!(source.color_space, S::Lab | S::Lch | S::Oklab | S::Oklch) { if matches!(self.color_space, S::Lab | S::Lch | S::Oklab | S::Oklch) { - self.flags - .set(F::C0_IS_NONE, source.flags.contains(F::C0_IS_NONE)); + self.flags |= source.flags & F::C0_IS_NONE; } else if matches!(self.color_space, S::Hsl) { - self.flags - .set(F::C2_IS_NONE, source.flags.contains(F::C0_IS_NONE)); + if source.flags.contains(F::C0_IS_NONE) { + self.flags.insert(F::C2_IS_NONE) + } } } else if matches!(source.color_space, S::Hsl) && matches!(self.color_space, S::Lab | S::Lch | S::Oklab | S::Oklch) { - self.flags - .set(F::C0_IS_NONE, source.flags.contains(F::C2_IS_NONE)); + if source.flags.contains(F::C2_IS_NONE) { + self.flags.insert(F::C0_IS_NONE) + } } // Colorfulness C, S if matches!(source.color_space, S::Hsl | S::Lch | S::Oklch) && matches!(self.color_space, S::Hsl | S::Lch | S::Oklch) { - self.flags - .set(F::C1_IS_NONE, source.flags.contains(F::C1_IS_NONE)); + self.flags |= source.flags & F::C1_IS_NONE; } // Hue H if matches!(source.color_space, S::Hsl | S::Hwb) { if matches!(self.color_space, S::Hsl | S::Hwb) { - self.flags - .set(F::C0_IS_NONE, source.flags.contains(F::C0_IS_NONE)); + self.flags |= source.flags & F::C0_IS_NONE; } else if matches!(self.color_space, S::Lch | S::Oklch) { - self.flags - .set(F::C2_IS_NONE, source.flags.contains(F::C0_IS_NONE)); + if source.flags.contains(F::C0_IS_NONE) { + self.flags.insert(F::C2_IS_NONE) + } } } else if matches!(source.color_space, S::Lch | S::Oklch) { if matches!(self.color_space, S::Hsl | S::Hwb) { - self.flags - .set(F::C0_IS_NONE, source.flags.contains(F::C2_IS_NONE)); + if source.flags.contains(F::C2_IS_NONE) { + self.flags.insert(F::C0_IS_NONE) + } } else if matches!(self.color_space, S::Lch | S::Oklch) { - self.flags - .set(F::C2_IS_NONE, source.flags.contains(F::C2_IS_NONE)); + self.flags |= source.flags & F::C2_IS_NONE; } } @@ -297,10 +297,8 @@ impl AbsoluteColor { if matches!(source.color_space, S::Lab | S::Oklab) && matches!(self.color_space, S::Lab | S::Oklab) { - self.flags - .set(F::C1_IS_NONE, source.flags.contains(F::C1_IS_NONE)); - self.flags - .set(F::C2_IS_NONE, source.flags.contains(F::C2_IS_NONE)); + self.flags |= source.flags & F::C1_IS_NONE; + self.flags |= source.flags & F::C2_IS_NONE; } } } diff --git a/servo/components/style/queries/condition.rs b/servo/components/style/queries/condition.rs @@ -11,7 +11,7 @@ use super::{FeatureFlags, FeatureType, QueryFeatureExpression}; use crate::custom_properties; use crate::stylesheets::CustomMediaEvaluator; use crate::values::{computed, AtomString, DashedIdent}; -use crate::{error_reporting::ContextualParseError, parser::ParserContext}; +use crate::{error_reporting::ContextualParseError, parser::ParserContext, parser::Parse}; use cssparser::{Parser, SourcePosition, Token}; use selectors::kleene_value::KleeneValue; use servo_arc::Arc; @@ -405,6 +405,11 @@ impl QueryCondition { Ok(expr) => return Ok(Self::Feature(expr)), Err(e) => e, }; + if static_prefs::pref!("layout.css.custom-media.enabled") { + if let Ok(custom) = input.try_parse(|input| DashedIdent::parse(context, input)) { + return Ok(Self::Custom(custom)); + } + } if let Ok(inner) = Self::parse(context, input, feature_type) { return Ok(Self::InParens(Box::new(inner))); } diff --git a/taskcluster/gecko_taskgraph/util/chunking.py b/taskcluster/gecko_taskgraph/util/chunking.py @@ -308,22 +308,13 @@ class DefaultLoader(BaseManifestLoader): disabled=False, exists=False, filters=filters, **mozinfo ) - all_manifests = {chunk_by_runtime.get_manifest(t) for t in tests} - - active = {} - for t in active_tests: - mp = chunk_by_runtime.get_manifest(t) - dir_relpath = t["dir_relpath"] - if not mp.startswith(dir_relpath): - active.setdefault(mp, set()).add(dir_relpath) - else: - active.setdefault(mp, set()) - - skipped = all_manifests - set(active.keys()) + active_manifests = {chunk_by_runtime.get_manifest(t) for t in active_tests} + skipped_manifests = {chunk_by_runtime.get_manifest(t) for t in tests} + skipped_manifests.difference_update(active_manifests) return { - "active": list(active.keys()), - "skipped": list(skipped), + "active": list(active_manifests), + "skipped": list(skipped_manifests), "other_dirs": {}, } diff --git a/testing/mozbase/manifestparser/manifestparser/filters.py b/testing/mozbase/manifestparser/manifestparser/filters.py @@ -33,12 +33,12 @@ def skip_if(tests, values, strict=False): Sets disabled on all tests containing the `skip-if` tag and whose condition is True. This filter is added by default. """ - tag = "skip-if" for test in tests: - if tag in test: - matching_expr = _match(test[tag], strict, **values) + test_tag = test.get("skip-if") + if test_tag: + matching_expr = _match(test_tag, strict, **values) if matching_expr: - test.setdefault("disabled", f"{tag}: {matching_expr}") + test.setdefault("disabled", f"skip-if: {matching_expr}") yield test diff --git a/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic-ref.html b/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic-ref.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<style> +#grid { + display: grid; + grid: 150px 100px / 200px 300px; + padding: 20px; + position: relative; + border: 1px solid; +} + +#positioned { + position: absolute; + background: magenta; + grid-column: 1 / 2; + grid-row: 1 / 2; + left: 500px; + bottom: 0; +} + +#static { + background: pink; + grid-column: 1 / 2; + grid-row: 1 / 2; +} + +#anchor { + background: lime; + grid-column: 2 / 3; + grid-row: 2 / 3; +} + +.abs-cb { + width: 600px; + height: 600px; + position: relative; +} +</style> + +<div id="grid"> + <div id="anchor"></div> + <div id="positioned">Anchored</div> + <div id="static"></div> +</div> diff --git a/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic.html b/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1924786"> +<link rel="help" href="https://drafts.csswg.org/css-position/#original-cb"> +<link rel="match" href="grid-position-area-basic-ref.html"> +<style> +#grid { + display: grid; + grid: 150px 100px / 200px 300px; + padding: 20px; + position: relative; + border: 1px solid; +} + +#positioned { + position: absolute; + background: magenta; + grid-column: 1 / 2; + grid-row: 1 / 2; + position-anchor: --foo; + position-area: top right; + /* FIXME: Shouldn't be needed */ + width: fit-content; + height: fit-content; +} + +#static { + background: pink; + grid-column: 1 / 2; + grid-row: 1 / 2; +} + +#anchor { + background: lime; + grid-column: 2 / 3; + grid-row: 2 / 3; + anchor-name: --foo; +} + +.abs-cb { + width: 600px; + height: 600px; + position: relative; +} +</style> + +<div id="grid"> + <div id="anchor"></div> + <div id="positioned">Anchored</div> + <div id="static"></div> +</div> diff --git a/testing/web-platform/tests/css/css-color/parsing/color-computed-color-mix-function.html b/testing/web-platform/tests/css/css-color/parsing/color-computed-color-mix-function.html @@ -568,6 +568,9 @@ // Percent with calc that uses font-relative length. fuzzy_test_computed_color(`color-mix(in srgb, red calc(50% + (sign(100em - 1px) * 10%)), blue)`, `color(srgb 0.6 0 0.4)`); + + // Carry forward hue that became powerless due to conversion of colorspace + fuzzy_test_computed_color(`color-mix(in oklch, hsl(0 100% 100%), blue)`, `oklch(0.726007 0.156607 264.052)`); </script> </body> </html> diff --git a/testing/web-platform/tests/css/mediaqueries/at-custom-media-basic.html b/testing/web-platform/tests/css/mediaqueries/at-custom-media-basic.html @@ -0,0 +1,16 @@ +<!doctype html> +<title>Basic custom media query</title> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="author" href="https://mozilla.com" title="Mozilla"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=2004653"> +<link rel="help" href="https://drafts.csswg.org/mediaqueries-5/#custom-mq"> +<link rel="match" href="/css/reference/green.html"> +<style> +@custom-media --foo (width > 0px); +@media (--foo) { + :root { + background: green; + } +} +</style> +<div></div> diff --git a/toolkit/components/formautofill/FormAutofillStorageBase.sys.mjs b/toolkit/components/formautofill/FormAutofillStorageBase.sys.mjs @@ -136,7 +136,6 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { AutofillTelemetry: "resource://gre/modules/shared/AutofillTelemetry.sys.mjs", - CreditCard: "resource://gre/modules/CreditCard.sys.mjs", CreditCardRecord: "resource://gre/modules/shared/CreditCardRecord.sys.mjs", FormAutofillNameUtils: "resource://gre/modules/shared/FormAutofillNameUtils.sys.mjs", @@ -1746,45 +1745,14 @@ export class CreditCardsBase extends AutofillRecords { // NOTE: Computed fields should be always present in the storage no matter // it's empty or not. - let hasNewComputedFields = false; - if (creditCard.deleted) { - return hasNewComputedFields; + return; } - let type = lazy.CreditCard.getType(creditCard["cc-number"]); - if (type) { - creditCard["cc-type"] = type; - } - - // Compute split names - if (!("cc-given-name" in creditCard)) { - const nameParts = lazy.FormAutofillNameUtils.splitName( - creditCard["cc-name"] - ); - creditCard["cc-given-name"] = nameParts.given; - creditCard["cc-additional-name"] = nameParts.middle; - creditCard["cc-family-name"] = nameParts.family; - hasNewComputedFields = true; - } - - // Compute credit card expiration date - if (!("cc-exp" in creditCard)) { - if (creditCard["cc-exp-month"] && creditCard["cc-exp-year"]) { - creditCard["cc-exp"] = - String(creditCard["cc-exp-year"]) + - "-" + - String(creditCard["cc-exp-month"]).padStart(2, "0"); - } else { - creditCard["cc-exp"] = ""; - } - hasNewComputedFields = true; - } + lazy.CreditCardRecord.computeFields(creditCard); // Encrypt credit card number await this._encryptNumber(creditCard); - - return hasNewComputedFields; } async _encryptNumber(_creditCard) { diff --git a/toolkit/components/formautofill/shared/CreditCardRecord.sys.mjs b/toolkit/components/formautofill/shared/CreditCardRecord.sys.mjs @@ -12,6 +12,51 @@ import { FormAutofillNameUtils } from "resource://gre/modules/shared/FormAutofil * for processing and consistent data representation. */ export class CreditCardRecord { + /** + * Computes derived fields from the basic fields in the CreditCard object. + * + * @param {object} creditCard The credit card object + */ + static computeFields(creditCard) { + this.#computeCCNameFields(creditCard); + this.#computeCCExpirationDateFields(creditCard); + this.#computeCCTypeField(creditCard); + } + + static #computeCCExpirationDateFields(creditCard) { + if (!("cc-exp" in creditCard)) { + if (creditCard["cc-exp-month"] && creditCard["cc-exp-year"]) { + creditCard["cc-exp"] = + String(creditCard["cc-exp-year"]) + + "-" + + String(creditCard["cc-exp-month"]).padStart(2, "0"); + } else { + creditCard["cc-exp"] = ""; + } + } + } + + static #computeCCNameFields(creditCard) { + if (!("cc-given-name" in creditCard)) { + const nameParts = FormAutofillNameUtils.splitName(creditCard["cc-name"]); + creditCard["cc-given-name"] = nameParts.given; + creditCard["cc-additional-name"] = nameParts.middle; + creditCard["cc-family-name"] = nameParts.family; + } + } + + static #computeCCTypeField(creditCard) { + const type = CreditCard.getType(creditCard["cc-number"]); + if (type) { + creditCard["cc-type"] = type; + } + } + + /** + * Normalizes credit card fields by removing derived fields from the CreditCard, leaving the basic fields. + * + * @param {object} creditCard The credit card object + */ static normalizeFields(creditCard) { this.#normalizeCCNameFields(creditCard); this.#normalizeCCNumberFields(creditCard); diff --git a/toolkit/components/places/PlacesSemanticHistoryManager.sys.mjs b/toolkit/components/places/PlacesSemanticHistoryManager.sys.mjs @@ -62,6 +62,7 @@ XPCOMUtils.defineLazyPreferenceGetter( try { return new Map(JSON.parse(val)); } catch (ex) { + lazy.logger.debug("Invalid json in supportedRegions pref."); // Supposing a user may empty the pref to disable the feature, as they // don't know it should be a JSON string, we'll treat that as an empty // Map, so the feature is disabled. @@ -106,7 +107,7 @@ class PlacesSemanticHistoryManager { #updateTaskLatency = []; embedder; qualifiedForSemanticSearch = false; - #promiseRemoved = null; + #promiseInitialized = null; enoughEntries = false; #shutdownProgress = { state: "Not started" }; #deferredTaskInterval = DEFERRED_TASK_INTERVAL_MS; @@ -195,34 +196,45 @@ class PlacesSemanticHistoryManager { this.#updateTaskLatency = []; lazy.logger.trace("PlaceSemanticManager constructor"); - // When semantic history is disabled or not available anymore due to system - // requirements, we want to remove the database files, though we don't want - // to check on disk on every startup, thus we use a pref. The removal is - // done on startup anyway, as it's less likely to fail. - // We check UserValue because users may set it to false to try to disable - // the feature, then if we'd check the value the files would not be removed. - let wasInitialized = Services.prefs.prefHasUserValue( - "places.semanticHistory.initialized" - ); - let isAvailable = this.canUseSemanticSearch; - let removeFiles = - (wasInitialized && !isAvailable) || - Services.prefs.getBoolPref( - "places.semanticHistory.removeOnStartup", - false + this.#promiseInitialized = (async () => { + // canUseSemanticSearch depends on Region being initialized. + if (!lazy.Region.home) { + await lazy.Region.init(); + } + + // When semantic history is disabled or not available anymore due to + // system requirements, we want to remove the database files, though we + // don't want to check on disk on every startup, thus we use a pref. + // The removal is done on startup anyway, as it's less likely to fail. + // We check prefHasUserValue instead of the value itself, because users + // may set it to false to try to disable the feature, then checking value + // the files would not be removed. + lazy.logger.debug( + "PlaceSemanticManager detected region:", + lazy.Region.home ); - if (removeFiles) { - lazy.logger.info("Removing database files on startup"); - Services.prefs.clearUserPref("places.semanticHistory.removeOnStartup"); - this.#promiseRemoved = this.semanticDB - .removeDatabaseFiles() - .catch(console.error); - } - if (!isAvailable) { - Services.prefs.clearUserPref("places.semanticHistory.initialized"); - } else if (!wasInitialized) { - Services.prefs.setBoolPref("places.semanticHistory.initialized", true); - } + let wasInitialized = Services.prefs.prefHasUserValue( + "places.semanticHistory.initialized" + ); + + let isAvailable = this.canUseSemanticSearch; + let removeFiles = + (wasInitialized && !isAvailable) || + Services.prefs.getBoolPref( + "places.semanticHistory.removeOnStartup", + false + ); + if (removeFiles) { + lazy.logger.info("Removing database files on startup"); + Services.prefs.clearUserPref("places.semanticHistory.removeOnStartup"); + await this.semanticDB.removeDatabaseFiles().catch(console.error); + } + if (!isAvailable) { + Services.prefs.clearUserPref("places.semanticHistory.initialized"); + } else if (!wasInitialized) { + Services.prefs.setBoolPref("places.semanticHistory.initialized", true); + } + })(); } /** @@ -235,13 +247,16 @@ class PlacesSemanticHistoryManager { if ( Services.startup.isInOrBeyondShutdownPhase( Ci.nsIAppStartup.SHUTDOWN_PHASE_APPSHUTDOWNCONFIRMED - ) || - !this.canUseSemanticSearch + ) ) { return null; } - // We must eventually wait for removal to finish. - await this.#promiseRemoved; + + await this.#promiseInitialized; + + if (!this.canUseSemanticSearch) { + return null; + } // Avoid re-entrance using a cached promise rather than handing off a conn. if (!this.#promiseConn) { @@ -357,7 +372,7 @@ class PlacesSemanticHistoryManager { localePattern = localePattern.toLowerCase(); if ( localePattern.endsWith("*") && - appLocale.startsWith(localePattern.slice(0, -1)) + appLocale.startsWith(localePattern.replace(/-?\*$/, "")) ) { return true; } else if (localePattern == appLocale) { diff --git a/toolkit/components/places/tests/unit/test_PlacesSemanticHistoryManager.js b/toolkit/components/places/tests/unit/test_PlacesSemanticHistoryManager.js @@ -8,6 +8,7 @@ ChromeUtils.defineESModuleGetters(this, { sinon: "resource://testing-common/Sinon.sys.mjs", getPlacesSemanticHistoryManager: "resource://gre/modules/PlacesSemanticHistoryManager.sys.mjs", + Region: "resource://gre/modules/Region.sys.mjs", }); ChromeUtils.defineLazyGetter(this, "QuickSuggestTestUtils", () => { @@ -220,10 +221,10 @@ add_task(async function test_canUseSemanticSearch_region_locale() { setPref: "invalid json", // invalid, should use default. }, { - region: "US", - locale: "en", // wrong locale format - supported: false, - setPref: '[["US",["en-*"]]]', + region: "IT", + locale: "it", // short locale format + supported: true, + setPref: '[["IT",["it-*"]]]', }, { region: "US", @@ -356,6 +357,21 @@ add_task(async function test_removeDatabaseFilesOnStartup() { ); }); +add_task(async function test_empty_region() { + // Test that if region is empty (uninitialized) creating a semantic manager + // will try to initialize Region. + let stub = sinon.stub(Region, "home").get(() => ""); + let spy = sinon.spy(Region, "init"); + let semanticManager = createPlacesSemanticHistoryManager(); + Assert.ok( + !semanticManager.canUseSemanticSearch, + `Check semantic search disabled when region not set` + ); + Assert.ok(spy.calledOnce, "Region.init should have been called"); + spy.restore(); + stub.restore(); +}); + add_task(async function test_chunksTelemetry() { await PlacesTestUtils.addVisits([ { url: "https://test1.moz.com/", title: "test 1" },