From eccf613edfe480d34cb225dac203d3213f3ef2f7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 11 Nov 2021 12:49:55 -0500 Subject: [PATCH] Add ability to report filter issue from popup panel Related issue: - https://github.com/uBlockOrigin/uBlock-issues/issues/1541 A "chat" icon has been added to the popup panel to make it easy to report filter issue on specific sites. Reporting filter issues require a GitHub account, since uBO does not have a home server through which reports could be sent. The report icon is available only for when uBO is enabled on a given site. On mobile devices, the logger icon is replaced by the "chat" icon since it is more likely to be useful on small display devices. The logger can always be opened from the Support pane in the dashboard. --- src/_locales/en/messages.json | 52 ++++++++++ src/css/fa-icons.css | 1 + src/css/popup-fenix.css | 7 ++ src/css/support.css | 33 ++++++- src/img/fontawesome/fontawesome-defs.svg | 1 + src/js/fa-icons.js | 1 + src/js/html-filtering.js | 5 +- src/js/messaging.js | 32 +++++-- src/js/popup-fenix.js | 17 +++- src/js/scriptlet-filtering.js | 5 +- src/js/support.js | 109 +++++++++++++++++---- src/popup-fenix.html | 5 +- src/support.html | 115 +++++++++++++++-------- 13 files changed, 310 insertions(+), 73 deletions(-) diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 1a89f22ec..6eb70e759 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 a1d368d03..807a7f39c 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 a06e6a635..fa8c722b5 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 1d6f32f5a..9344dc0af 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 fe33f8e80..75bc67ff9 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 3c8f7dbb2..67638ba68 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 fd98aa872..e3ff2101a 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 74e761963..6bbba4e43 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 ecbd0b433..c01431ccb 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 ebd3067fb..3a090dbba 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 88a26bceb..d9591c0a8 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 ab8401592..5807857cd 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 8e8886a1f..92e31e713 100644 --- a/src/support.html +++ b/src/support.html @@ -17,53 +17,90 @@
-
-
-

-

-

-
- +
+
+
+

+

+

+
+ +
+
-
-
-
-

-

-

-
- +
+
+
+

+

+

+
+ +
+
-
-
-
-

-

-

-

-

-
- +
+
+
+

+

+

+

+

+
+ +
+
-
-
-
-

-

-

-
- +
+
+
+

+

+

+
+ +
+
+
+
+
+
+

+

+

+

+
+ +

+
+ +

+
+ + +
+
+
+
+
+

+

+

+

+

-
-

-

-

-

-