diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 1a89f22eca870..6eb70e759f2c7 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -127,6 +127,10 @@ "message": "Open the logger", "description": "Tooltip used for the logger icon in the panel" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipNoPopups": { "message": "Toggle the blocking of all popups for this site", "description": "Tooltip for the no-popups per-site switch" @@ -856,6 +860,14 @@ "message": "Open", "description": "Text for button which open an external webpage in Support pane" }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, "supportS1H": { "message": "Documentation", "description": "Header of 'Documentation' section in Support pane" @@ -908,6 +920,46 @@ "message": "Important: Potentially private or sensitive information is redacted by default. Redacted information may make it more difficult to solve a problem.", "description": "Second paragraph of 'Troubleshooting Information' section in Support pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the web page:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The web page...", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBlock Origin", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Breaks when uBlock Origin is enabled", + "description": "An entry in the widget used to select the type of issue" + }, "supportRedact": { "message": "Redact", "description": "Text for 'Redact' button" diff --git a/src/css/fa-icons.css b/src/css/fa-icons.css index a1d368d03cd1b..807a7f39cc700 100644 --- a/src/css/fa-icons.css +++ b/src/css/fa-icons.css @@ -64,6 +64,7 @@ width: calc(1em * 1794 / 1792); } .fa-icon > .fa-icon_clipboard, +.fa-icon > .fa-icon_comment-alt, .fa-icon > .fa-icon_external-link, .fa-icon > .fa-icon_eye-dropper, .fa-icon > .fa-icon_eye-open, diff --git a/src/css/popup-fenix.css b/src/css/popup-fenix.css index a06e6a6355994..fa8c722b58c26 100644 --- a/src/css/popup-fenix.css +++ b/src/css/popup-fenix.css @@ -203,6 +203,10 @@ body.mobile.no-tooltips .toolRibbon .tool { font-size: 1.6em; } +#basicTools:not(.canPick) .needPick { + visibility: hidden; + } + #extraTools .fa-icon { align-self: center; position: relative; @@ -576,6 +580,9 @@ body.godMode #actionSelector > #dynaAllow { :root body[data-ui~="+no-popups"] #no-popups { display: flex; } +:root.mobile [href="logger-ui.html#_"] { + display: none; + } body:not([data-more~="a"]) [data-more="a"], body:not([data-more~="b"]) [data-more="b"], body:not([data-more~="c"]) [data-more="c"], diff --git a/src/css/support.css b/src/css/support.css index 1d6f32f5a7b5a..9344dc0aff9b9 100644 --- a/src/css/support.css +++ b/src/css/support.css @@ -2,21 +2,52 @@ body { margin-bottom: 6rem; } +.body > div { + max-width: 800px; + } + .supportEntry { display: flex; margin-top: 1em; } +:root.mobile .supportEntry { + flex-direction: column; + } .supportEntry > div:first-of-type { flex-grow: 1; } -.supportEntry > div:last-of-type { +.supportEntry > div.hasButtons { align-items: center; display: flex; + justify-content: space-around; } .supportEntry h3 { margin-top: 0; } + +.e > .supportEntry { + flex-direction: column; + } +.e > .supportEntry > div:not(:first-of-type) { + margin-top: 1em; + } +.e > .supportEntry *:is(input,select) { + padding: var(--default-gap-xxsmall); + } +.e > .supportEntry input[type="url"] { + width: 100%; + } +.e > .supportEntry *:is(input,select) { + max-width: calc(100% - 1em); + } +body:not(.filterIssue) .body > div.e { + display: none; +} +body.filterIssue .body > div:not(.e) { + display: none; +} + button { margin-inline-end: 1em; -webkit-margin-end: 1em; diff --git a/src/img/fontawesome/fontawesome-defs.svg b/src/img/fontawesome/fontawesome-defs.svg index fe33f8e80a81e..75bc67ff93a15 100644 --- a/src/img/fontawesome/fontawesome-defs.svg +++ b/src/img/fontawesome/fontawesome-defs.svg @@ -38,6 +38,7 @@ License - https://github.com/FortAwesome/Font-Awesome/tree/a8386aae19e200ddb0f68 + diff --git a/src/js/fa-icons.js b/src/js/fa-icons.js index 3c8f7dbb28154..67638ba68f044 100644 --- a/src/js/fa-icons.js +++ b/src/js/fa-icons.js @@ -40,6 +40,7 @@ const faIconsInit = (( ) => { [ 'code', { viewBox: '0 0 1830 1373', path: 'm 572,1125.5 -50,50 q -10,10 -23,10 -13,0 -23,-10 l -466,-466 q -10,-10 -10,-23 0,-13 10,-23 l 466,-466 q 10,-10 23,-10 13,0 23,10 l 50,50 q 10,10 10,23 0,13 -10,23 l -393,393 393,393 q 10,10 10,23 0,13 -10,23 z M 1163,58.476203 790,1349.4762 q -4,13 -15.5,19.5 -11.5,6.5 -23.5,2.5 l -62,-17 q -13,-4 -19.5,-15.5 -6.5,-11.5 -2.5,-24.5 L 1040,23.5 q 4,-13 15.5,-19.5 11.5,-6.5 23.5,-2.5 l 62,17 q 13,4 19.5,15.5 6.5,11.5 2.5,24.5 z m 657,651 -466,466 q -10,10 -23,10 -13,0 -23,-10 l -50,-50 q -10,-10 -10,-23 0,-13 10,-23 l 393,-393 -393,-393 q -10,-10 -10,-23 0,-13 10,-23 l 50,-50 q 10,-10 23,-10 13,0 23,10 l 466,466 q 10,10 10,23 0,13 -10,23 z' } ], [ 'cog', { viewBox: '0 0 1536 1536', path: 'm 1024,768 q 0,-106 -75,-181 -75,-75 -181,-75 -106,0 -181,75 -75,75 -75,181 0,106 75,181 75,75 181,75 106,0 181,-75 75,-75 75,-181 z m 512,-109 0,222 q 0,12 -8,23 -8,11 -20,13 l -185,28 q -19,54 -39,91 35,50 107,138 10,12 10,25 0,13 -9,23 -27,37 -99,108 -72,71 -94,71 -12,0 -26,-9 l -138,-108 q -44,23 -91,38 -16,136 -29,186 -7,28 -36,28 l -222,0 q -14,0 -24.5,-8.5 Q 622,1519 621,1506 l -28,-184 q -49,-16 -90,-37 l -141,107 q -10,9 -25,9 -14,0 -25,-11 -126,-114 -165,-168 -7,-10 -7,-23 0,-12 8,-23 15,-21 51,-66.5 36,-45.5 54,-70.5 -27,-50 -41,-99 L 29,913 Q 16,911 8,900.5 0,890 0,877 L 0,655 q 0,-12 8,-23 8,-11 19,-13 l 186,-28 q 14,-46 39,-92 -40,-57 -107,-138 -10,-12 -10,-24 0,-10 9,-23 26,-36 98.5,-107.5 Q 315,135 337,135 q 13,0 26,10 L 501,252 Q 545,229 592,214 608,78 621,28 628,0 657,0 L 879,0 Q 893,0 903.5,8.5 914,17 915,30 l 28,184 q 49,16 90,37 l 142,-107 q 9,-9 24,-9 13,0 25,10 129,119 165,170 7,8 7,22 0,12 -8,23 -15,21 -51,66.5 -36,45.5 -54,70.5 26,50 41,98 l 183,28 q 13,2 21,12.5 8,10.5 8,23.5 z' } ], [ 'cogs', { viewBox: '0 0 1920 1761', path: 'm 896,880 q 0,-106 -75,-181 -75,-75 -181,-75 -106,0 -181,75 -75,75 -75,181 0,106 75,181 75,75 181,75 106,0 181,-75 75,-75 75,-181 z m 768,512 q 0,-52 -38,-90 -38,-38 -90,-38 -52,0 -90,38 -38,38 -38,90 0,53 37.5,90.5 37.5,37.5 90.5,37.5 53,0 90.5,-37.5 37.5,-37.5 37.5,-90.5 z m 0,-1024 q 0,-52 -38,-90 -38,-38 -90,-38 -52,0 -90,38 -38,38 -38,90 0,53 37.5,90.5 37.5,37.5 90.5,37.5 53,0 90.5,-37.5 Q 1664,421 1664,368 Z m -384,421 v 185 q 0,10 -7,19.5 -7,9.5 -16,10.5 l -155,24 q -11,35 -32,76 34,48 90,115 7,11 7,20 0,12 -7,19 -23,30 -82.5,89.5 -59.5,59.5 -78.5,59.5 -11,0 -21,-7 l -115,-90 q -37,19 -77,31 -11,108 -23,155 -7,24 -30,24 H 547 q -11,0 -20,-7.5 -9,-7.5 -10,-17.5 l -23,-153 q -34,-10 -75,-31 l -118,89 q -7,7 -20,7 -11,0 -21,-8 -144,-133 -144,-160 0,-9 7,-19 10,-14 41,-53 31,-39 47,-61 -23,-44 -35,-82 L 24,1000 Q 14,999 7,990.5 0,982 0,971 V 786 Q 0,776 7,766.5 14,757 23,756 l 155,-24 q 11,-35 32,-76 -34,-48 -90,-115 -7,-11 -7,-20 0,-12 7,-20 22,-30 82,-89 60,-59 79,-59 11,0 21,7 l 115,90 q 34,-18 77,-32 11,-108 23,-154 7,-24 30,-24 h 186 q 11,0 20,7.5 9,7.5 10,17.5 l 23,153 q 34,10 75,31 l 118,-89 q 8,-7 20,-7 11,0 21,8 144,133 144,160 0,8 -7,19 -12,16 -42,54 -30,38 -45,60 23,48 34,82 l 152,23 q 10,2 17,10.5 7,8.5 7,19.5 z m 640,533 v 140 q 0,16 -149,31 -12,27 -30,52 51,113 51,138 0,4 -4,7 -122,71 -124,71 -8,0 -46,-47 -38,-47 -52,-68 -20,2 -30,2 -10,0 -30,-2 -14,21 -52,68 -38,47 -46,47 -2,0 -124,-71 -4,-3 -4,-7 0,-25 51,-138 -18,-25 -30,-52 -149,-15 -149,-31 v -140 q 0,-16 149,-31 13,-29 30,-52 -51,-113 -51,-138 0,-4 4,-7 4,-2 35,-20 31,-18 59,-34 28,-16 30,-16 8,0 46,46.5 38,46.5 52,67.5 20,-2 30,-2 10,0 30,2 51,-71 92,-112 l 6,-2 q 4,0 124,70 4,3 4,7 0,25 -51,138 17,23 30,52 149,15 149,31 z m 0,-1024 v 140 q 0,16 -149,31 -12,27 -30,52 51,113 51,138 0,4 -4,7 -122,71 -124,71 -8,0 -46,-47 -38,-47 -52,-68 -20,2 -30,2 -10,0 -30,-2 -14,21 -52,68 -38,47 -46,47 -2,0 -124,-71 -4,-3 -4,-7 0,-25 51,-138 -18,-25 -30,-52 -149,-15 -149,-31 V 298 q 0,-16 149,-31 13,-29 30,-52 -51,-113 -51,-138 0,-4 4,-7 4,-2 35,-20 31,-18 59,-34 28,-16 30,-16 8,0 46,46.5 38,46.5 52,67.5 20,-2 30,-2 10,0 30,2 51,-71 92,-112 l 6,-2 q 4,0 124,70 4,3 4,7 0,25 -51,138 17,23 30,52 149,15 149,31 z' } ], + [ 'comment-alt', { viewBox: '0 0 1792 1536', path: 'M 896,128 Q 692,128 514.5,197.5 337,267 232.5,385 128,503 128,640 128,752 199.5,853.5 271,955 401,1029 l 87,50 -27,96 q -24,91 -70,172 152,-63 275,-171 l 43,-38 57,6 q 69,8 130,8 204,0 381.5,-69.5 Q 1455,1013 1559.5,895 1664,777 1664,640 1664,503 1559.5,385 1455,267 1277.5,197.5 1100,128 896,128 Z m 896,512 q 0,174 -120,321.5 -120,147.5 -326,233 -206,85.5 -450,85.5 -70,0 -145,-8 -198,175 -460,242 -49,14 -114,22 h -5 q -15,0 -27,-10.5 -12,-10.5 -16,-27.5 v -1 q -3,-4 -0.5,-12 2.5,-8 2,-10 -0.5,-2 4.5,-9.5 l 6,-9 q 0,0 7,-8.5 7,-8.5 8,-9 7,-8 31,-34.5 24,-26.5 34.5,-38 10.5,-11.5 31,-39.5 20.5,-28 32.5,-51 12,-23 27,-59 15,-36 26,-76 Q 181,1052 90.5,921 0,790 0,640 0,466 120,318.5 240,171 446,85.5 652,0 896,0 q 244,0 450,85.5 206,85.5 326,233 120,147.5 120,321.5 z' } ], [ 'double-angle-left', { viewBox: '0 0 966 998', path: 'm 582,915 q 0,13 -10,23 l -50,50 q -10,10 -23,10 -13,0 -23,-10 L 10,522 Q 0,512 0,499 0,486 10,476 L 476,10 q 10,-10 23,-10 13,0 23,10 l 50,50 q 10,10 10,23 0,13 -10,23 L 179,499 572,892 q 10,10 10,23 z m 384,0 q 0,13 -10,23 l -50,50 q -10,10 -23,10 -13,0 -23,-10 L 394,522 q -10,-10 -10,-23 0,-13 10,-23 L 860,10 q 10,-10 23,-10 13,0 23,10 l 50,50 q 10,10 10,23 0,13 -10,23 L 563,499 956,892 q 10,10 10,23 z' } ], [ 'double-angle-up', { viewBox: '0 0 998 966', path: 'm 998,883 q 0,13 -10,23 l -50,50 q -10,10 -23,10 -13,0 -23,-10 L 499,563 106,956 Q 96,966 83,966 70,966 60,956 L 10,906 Q 0,896 0,883 0,870 10,860 L 476,394 q 10,-10 23,-10 13,0 23,10 l 466,466 q 10,10 10,23 z m 0,-384 q 0,13 -10,23 l -50,50 q -10,10 -23,10 -13,0 -23,-10 L 499,179 106,572 Q 96,582 83,582 70,582 60,572 L 10,522 Q 0,512 0,499 0,486 10,476 L 476,10 q 10,-10 23,-10 13,0 23,10 l 466,466 q 10,10 10,23 z' } ], [ 'download-alt', { viewBox: '0 0 1664 1536', path: 'm 1280,1344 q 0,-26 -19,-45 -19,-19 -45,-19 -26,0 -45,19 -19,19 -19,45 0,26 19,45 19,19 45,19 26,0 45,-19 19,-19 19,-45 z m 256,0 q 0,-26 -19,-45 -19,-19 -45,-19 -26,0 -45,19 -19,19 -19,45 0,26 19,45 19,19 45,19 26,0 45,-19 19,-19 19,-45 z m 128,-224 v 320 q 0,40 -28,68 -28,28 -68,28 H 96 q -40,0 -68,-28 -28,-28 -28,-68 v -320 q 0,-40 28,-68 28,-28 68,-28 h 465 l 135,136 q 58,56 136,56 78,0 136,-56 l 136,-136 h 464 q 40,0 68,28 28,28 28,68 z M 1339,551 q 17,41 -14,70 l -448,448 q -18,19 -45,19 -27,0 -45,-19 L 339,621 q -31,-29 -14,-70 17,-39 59,-39 H 640 V 64 Q 640,38 659,19 678,0 704,0 h 256 q 26,0 45,19 19,19 19,45 v 448 h 256 q 42,0 59,39 z' } ], diff --git a/src/js/html-filtering.js b/src/js/html-filtering.js index fd98aa8720f50..e3ff2101af3da 100644 --- a/src/js/html-filtering.js +++ b/src/js/html-filtering.js @@ -50,7 +50,10 @@ const htmlFilteringEngine = { }, get discardedCount() { return discardedCount; - } + }, + getFilterCount() { + return filterDB.size; + }, }; const PSelectorHasTextTask = class { diff --git a/src/js/messaging.js b/src/js/messaging.js index 74e761963b2b4..6bbba4e43bd96 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -28,6 +28,7 @@ import punycode from '../lib/punycode.js'; import cacheStorage from './cachestorage.js'; import cosmeticFilteringEngine from './cosmetic-filtering.js'; +import htmlFilteringEngine from './html-filtering.js'; import logger from './logger.js'; import lz4Codec from './lz4.js'; import io from './assets.js'; @@ -477,15 +478,22 @@ const onMessage = function(request, sender, callback) { // Sync let response; - let pageStore; switch ( request.what ) { - case 'hasPopupContentChanged': - pageStore = µb.pageStoreFromTabId(request.tabId); - var lastModified = pageStore ? pageStore.contentLastModified : 0; + case 'hasPopupContentChanged': { + const pageStore = µb.pageStoreFromTabId(request.tabId); + const lastModified = pageStore ? pageStore.contentLastModified : 0; response = lastModified !== request.contentLastModified; break; - + } + case 'launchReporter': { + const pageStore = µb.pageStoreFromTabId(request.tabId); + if ( pageStore === null ) { break; } + const supportURL = new URL(vAPI.getURL('support.html')); + supportURL.searchParams.set('reportURL', pageStore.rawURL); + µb.openNewTab({ url: supportURL.href, select: true, index: -1 }); + break; + } case 'revertFirewallRules': // TODO: use Set() to message around sets of hostnames sessionFirewall.copyRules( @@ -537,8 +545,8 @@ const onMessage = function(request, sender, callback) { response = popupDataFromTabId(request.tabId); break; - case 'toggleNetFiltering': - pageStore = µb.pageStoreFromTabId(request.tabId); + case 'toggleNetFiltering': { + const pageStore = µb.pageStoreFromTabId(request.tabId); if ( pageStore ) { pageStore.toggleNetFilteringSwitch( request.url, @@ -548,7 +556,7 @@ const onMessage = function(request, sender, callback) { µb.updateToolbarIcon(request.tabId, 0b111); } break; - + } default: return vAPI.messaging.UNHANDLED; } @@ -1304,16 +1312,22 @@ const getSupportData = async function() { extensionVersion: vAPI.app.version, modifiedUserSettings, modifiedHiddenSettings, + 'filterset (summary)': { + network: staticNetFilteringEngine.getFilterCount(), + cosmetic: cosmeticFilteringEngine.getFilterCount(), + scriptlet: scriptletFilteringEngine.getFilterCount(), + html: htmlFilteringEngine.getFilterCount(), + }, 'listset (total-discarded, last updated)': { removed: removedListset, added: addedListset, default: defaultListset, }, + 'filterset (user)': filterset, trustedset: diffArrays( µb.arrayFromWhitelist(µb.netWhitelist), µb.netWhitelistDefault ), - filterset, switchRuleset: diffArrays( sessionSwitches.toArray(), µb.hostnameSwitchesDefault diff --git a/src/js/popup-fenix.js b/src/js/popup-fenix.js index ecbd0b433627b..c01431ccb10c2 100644 --- a/src/js/popup-fenix.js +++ b/src/js/popup-fenix.js @@ -570,9 +570,10 @@ const renderPopup = function() { } } - const canElementPicker = popupData.canElementPicker === true && isFiltering; - uDom.nodeFromId('gotoPick').classList.toggle('enabled', canElementPicker); - uDom.nodeFromId('gotoZap').classList.toggle('enabled', canElementPicker); + uDom.nodeFromId('basicTools').classList.toggle( + 'canPick', + popupData.canElementPicker === true && isFiltering + ); let blocked, total; if ( popupData.pageCounts !== undefined ) { @@ -844,6 +845,15 @@ const gotoPick = function() { /******************************************************************************/ +const gotoReport = function() { + messaging.send('popupPanel', { + what: 'launchReporter', + tabId: popupData.tabId, + }); +}; + +/******************************************************************************/ + const gotoURL = function(ev) { if ( this.hasAttribute('href') === false ) { return; } @@ -1382,6 +1392,7 @@ const getPopupData = async function(tabId, first = false) { uDom('#switch').on('click', toggleNetFilteringSwitch); uDom('#gotoZap').on('click', gotoZap); uDom('#gotoPick').on('click', gotoPick); +uDom('#gotoReport').on('click', gotoReport); uDom('.hnSwitch').on('click', ev => { toggleHostnameSwitch(ev); }); uDom('#saveRules').on('click', saveFirewallRules); uDom('#revertRules').on('click', ( ) => { revertFirewallRules(); }); diff --git a/src/js/scriptlet-filtering.js b/src/js/scriptlet-filtering.js index ebd3067fb7037..3a090dbbaeb18 100644 --- a/src/js/scriptlet-filtering.js +++ b/src/js/scriptlet-filtering.js @@ -57,7 +57,10 @@ const scriptletFilteringEngine = { }, get discardedCount() { return discardedCount; - } + }, + getFilterCount() { + return scriptletDB.size; + }, }; // Purpose of `contentscriptCode` below is too programmatically inject diff --git a/src/js/support.js b/src/js/support.js index 88a26bceb875e..d9591c0a81be9 100644 --- a/src/js/support.js +++ b/src/js/support.js @@ -28,6 +28,7 @@ let supportData; const uselessKeys = [ + 'modifiedHiddenSettings.benchmarkDatasetURL', 'modifiedUserSettings.popupPanelSections', 'modifiedUserSettings.externalLists', 'modifiedUserSettings.importedLists', @@ -113,21 +114,25 @@ function patchEmptiness(data, prop) { } } -function addDetailsToReportURL(id) { +function configToMarkdown(collapse = false) { const text = cmEditor.getValue().replace(/^ /gm, ''); + return collapse + ? '
\n\n```yaml\n' + text + '\n```\n
' + : '```yaml\n' + text + '\n```\n'; +} + +function addDetailsToReportURL(id, collapse = false) { const elem = uDom.nodeFromId(id); const url = new URL(elem.getAttribute('data-url')); - url.searchParams.set( - 'configuration', - '
\n\n```yaml\n' + text + '\n```\n
' - ); + url.searchParams.set('configuration', configToMarkdown(collapse)); elem.setAttribute('data-url', url); } function showData() { const shownData = JSON.parse(JSON.stringify(supportData)); uselessKeys.forEach(prop => { removeKey(shownData, prop); }); - if ( document.body.classList.contains('redacted') ) { + const redacted = document.body.classList.contains('redacted'); + if ( redacted ) { sensitiveValues.forEach(prop => { redactValue(shownData, prop); }); sensitiveKeys.forEach(prop => { redactKeys(shownData, prop); }); } @@ -139,8 +144,8 @@ function showData() { .slice(1, -1) .map(v => { return v - .replace( /^( *)"/, ' $1') - .replace( /^( +.*[^\\])(?:": "|": \{$|": \[$|": )/, '$1: ') + .replace( /^( *?) "/, '$1') + .replace( /^( *.*[^\\])(?:": "|": \{$|": \[$|": )/, '$1: ') .replace( /(?:",?|\},?|\],?|,)$/, ''); }) .filter(v => v.trim() !== '') @@ -149,15 +154,77 @@ function showData() { cmEditor.setValue(text); cmEditor.clearHistory(); - addDetailsToReportURL('filterReport'); - addDetailsToReportURL('bugReport'); + addDetailsToReportURL('filterReport', redacted === false); + addDetailsToReportURL('bugReport', redacted === false); +} + +/******************************************************************************/ + +const reportURL = (( ) => { + const url = new URL(window.location.href); + try { + const reportURL = url.searchParams.get('reportURL'); + if ( reportURL !== null ) { + document.body.classList.add('filterIssue'); + } + document.querySelector('[data-i18n="supportS6URL"] ~ input').value = reportURL; + return new URL(reportURL); + } catch(ex) { + } + return null; +})(); + +function reportSpecificFilterHostname() { + return reportURL.hostname.replace(/^www\./, ''); +} + +function reportSpecificFilterType() { + return document.querySelector('[data-i18n="supportS6Select1"] ~ select').value; +} + +function reportSpecificFilterIssue(ev) { + const bodyTemplate = [ + '### Address of the web page', + '', + '`{{url}}`', + '', + '### Type of issue', + '', + '{{type}}', + '', + '### Description (when issue is not obvious)', + '', + '[none]', + '', + '### Screenshot (when description is difficult)', + '', + '[none]', + '', + '### Configuration', + '', + '{{configuration}}', + ].join('\n'); + const githubURL = new URL('https://github.com/uBlockOrigin/uAssets/issues/new'); + const issueType = document.querySelector('[data-i18n="supportS6Select1"] ~ select').value; + const title = `${reportSpecificFilterHostname()}: ${reportSpecificFilterType()}`; + const body = bodyTemplate + .replace('{{url}}', reportURL.href) + .replace('{{type}}', issueType) + .replace('{{configuration}}', configToMarkdown(false)); + githubURL.searchParams.set('title', title); + githubURL.searchParams.set('body', body); + vAPI.messaging.send('default', { + what: 'gotoURL', + details: { url: githubURL.href, select: true, index: -1 }, + }); + ev.preventDefault(); } /******************************************************************************/ const cmEditor = new CodeMirror(document.getElementById('supportData'), { autofocus: true, - lineWrapping: true, + readOnly: true, styleActiveLine: true, }); @@ -170,12 +237,6 @@ uBlockDashboard.patchCodeMirrorEditor(cmEditor); what: 'getSupportData', }); - // Remove unnecessary information - if ( supportData.modifiedHiddenSettings instanceof Object ) { - const o = supportData.modifiedHiddenSettings; - o.benchmarkDatasetURL = undefined; - } - showData(); uDom('[data-url]').on('click', ev => { @@ -189,6 +250,20 @@ uBlockDashboard.patchCodeMirrorEditor(cmEditor); ev.preventDefault(); }); + uDom('[data-i18n="supportReportSpecificButton"]').on('click', ev => { + reportSpecificFilterIssue(ev); + }); + + uDom('[data-i18n="supportFindSpecificButton"]').on('click', ev => { + const url = new URL('https://github.com/uBlockOrigin/uAssets/issues'); + url.searchParams.set('q', `is:issue "${reportSpecificFilterHostname()}" in:title`); + vAPI.messaging.send('default', { + what: 'gotoURL', + details: { url: url.href, select: true, index: -1 }, + }); + ev.preventDefault(); + }); + uDom('#redactButton').on('click', ( ) => { document.body.classList.add('redacted'); showData(); diff --git a/src/popup-fenix.html b/src/popup-fenix.html index ab84015926ca6..5807857cd732e 100644 --- a/src/popup-fenix.html +++ b/src/popup-fenix.html @@ -57,8 +57,9 @@
- bolt - eye-dropper + bolt + eye-dropper + comment-alt list-alt cogs
diff --git a/src/support.html b/src/support.html index 8e8886a1fda16..92e31e713e108 100644 --- a/src/support.html +++ b/src/support.html @@ -17,53 +17,90 @@
-
-
-

-

-

-
- +
+
+
+

+

+

+
+ +
+
-
-
-
-

-

-

-
- +
+
+
+

+

+

+
+ +
+
-
-
-
-

-

-

-

-

-
- +
+
+
+

+

+

+

+

+
+ +
+
-
-
-
-

-

+

+
+
+

+

+

+
+ +
-
- +
+
+
+
+
+

+

+

+

+
+ +

+
+ +

+
+ + +
+
+
+
+

+

+

+

+

-
-

-

-

-

-