From 886664abd46bb80a30c69306b2ef3474ab45d631 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 6 Oct 2018 10:51:34 -0400 Subject: [PATCH] fix https://github.com/uBlockOrigin/uMatrix-issues/issues/59 and other unrelated quirks Unrelated quirks: - missing icons for magnifier (because https://github.com/uBlockOrigin/uMatrix-issues/issues/68) - missing i18n string - use separate file for CSS styles --- src/_locales/en/messages.json | 4 + src/css/fa-icons.css | 2 + src/img/fontawesome/fontawesome-defs.svg | 2 + src/js/main-blocked.js | 84 ++++++++-------- src/js/traffic.js | 32 +++++-- src/main-blocked.html | 117 +++-------------------- 6 files changed, 88 insertions(+), 153 deletions(-) diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 7eb21da..428547a 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -655,6 +655,10 @@ "message": "Because of the following rule", "description": "English: Because of the following rule" }, + "mainBlockedNoParamsPrompt": { + "message": "without parameters", + "description": "label to be used for the parameter-less URL: https://cloud.githubusercontent.com/assets/585534/9832014/bfb1b8f0-593b-11e5-8a27-fba472a5529a.png" + }, "mainBlockedBack" : { "message": "Go back", "description": "English: Go back" diff --git a/src/css/fa-icons.css b/src/css/fa-icons.css index 87a5a23..f1ee049 100644 --- a/src/css/fa-icons.css +++ b/src/css/fa-icons.css @@ -63,6 +63,8 @@ .fa-icon > .fa-icon_power-off, .fa-icon > .fa-icon_question-circle, .fa-icon > .fa-icon_reply, +.fa-icon > .fa-icon_search-minus, +.fa-icon > .fa-icon_search-plus, .fa-icon > .fa-icon_spinner, .fa-icon > .fa-icon_sync-alt, .fa-icon > .fa-icon_th, diff --git a/src/img/fontawesome/fontawesome-defs.svg b/src/img/fontawesome/fontawesome-defs.svg index adba022..82325fd 100644 --- a/src/img/fontawesome/fontawesome-defs.svg +++ b/src/img/fontawesome/fontawesome-defs.svg @@ -27,6 +27,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + diff --git a/src/js/main-blocked.js b/src/js/main-blocked.js index 9dd318a..74f46ea 100644 --- a/src/js/main-blocked.js +++ b/src/js/main-blocked.js @@ -1,7 +1,7 @@ /******************************************************************************* uMatrix - a browser extension to block requests. - Copyright (C) 2015-2017 Raymond Hill + Copyright (C) 2015-present Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,10 +29,10 @@ /******************************************************************************/ -var details = {}; +let details = {}; (function() { - var matches = /details=([^&]+)/.exec(window.location.search); + let matches = /details=([^&]+)/.exec(window.location.search); if ( matches === null ) { return; } try { details = JSON.parse(atob(matches[1])); @@ -52,17 +52,15 @@ uDom('.what').text(details.url); // https://github.com/gorhill/uBlock/blob/master/src/js/document-blocked.js (function() { - if ( typeof URL !== 'function' ) { return; } + let reURL = /^https?:\/\//; - var reURL = /^https?:\/\//; - - var liFromParam = function(name, value) { + let liFromParam = function(name, value) { if ( value === '' ) { value = name; name = ''; } - var li = document.createElement('li'); - var span = document.createElement('span'); + let li = document.createElement('li'); + let span = document.createElement('span'); span.textContent = name; li.appendChild(span); if ( name !== '' && value !== '' ) { @@ -70,7 +68,7 @@ uDom('.what').text(details.url); } span = document.createElement('span'); if ( reURL.test(value) ) { - var a = document.createElement('a'); + let a = document.createElement('a'); a.href = a.textContent = value; span.appendChild(a); } else { @@ -80,7 +78,7 @@ uDom('.what').text(details.url); return li; }; - var safeDecodeURIComponent = function(s) { + let safeDecodeURIComponent = function(s) { try { s = decodeURIComponent(s); } catch (ex) { @@ -88,31 +86,30 @@ uDom('.what').text(details.url); return s; }; - var renderParams = function(parentNode, rawURL) { - var a = document.createElement('a'); + let renderParams = function(parentNode, rawURL) { + let a = document.createElement('a'); a.href = rawURL; if ( a.search.length === 0 ) { return false; } - var pos = rawURL.indexOf('?'); - var li = liFromParam( - vAPI.i18n('docblockedNoParamsPrompt'), + let pos = rawURL.indexOf('?'); + let li = liFromParam( + vAPI.i18n('mainBlockedNoParamsPrompt'), rawURL.slice(0, pos) ); parentNode.appendChild(li); - var params = a.search.slice(1).split('&'); - var param, name, value, ul; + let params = a.search.slice(1).split('&'); for ( var i = 0; i < params.length; i++ ) { - param = params[i]; - pos = param.indexOf('='); + let param = params[i]; + let pos = param.indexOf('='); if ( pos === -1 ) { pos = param.length; } - name = safeDecodeURIComponent(param.slice(0, pos)); - value = safeDecodeURIComponent(param.slice(pos + 1)); + let name = safeDecodeURIComponent(param.slice(0, pos)); + let value = safeDecodeURIComponent(param.slice(pos + 1)); li = liFromParam(name, value); if ( reURL.test(value) ) { - ul = document.createElement('ul'); + let ul = document.createElement('ul'); renderParams(ul, value); li.appendChild(ul); } @@ -121,26 +118,31 @@ uDom('.what').text(details.url); return true; }; - if ( renderParams(uDom.nodeFromId('parsed'), details.url) === false ) { - return; - } + let hasParams = renderParams(uDom.nodeFromId('parsed'), details.url); + if ( hasParams === false ) { return; } - var toggler = document.createElement('span'); - toggler.className = 'fa'; - uDom('#theURL > p').append(toggler); - - uDom(toggler).on('click', function() { - var collapsed = uDom.nodeFromId('theURL').classList.toggle('collapsed'); - vAPI.localStorage.setItem( - 'document-blocked-collapse-url', - collapsed.toString() - ); - }); - - uDom.nodeFromId('theURL').classList.toggle( + let theURLNode = document.getElementById('theURL'); + theURLNode.classList.add('hasParams'); + theURLNode.classList.toggle( 'collapsed', vAPI.localStorage.getItem('document-blocked-collapse-url') === 'true' ); + + let toggleCollapse = function() { + vAPI.localStorage.setItem( + 'document-blocked-collapse-url', + theURLNode.classList.toggle('collapsed').toString() + ); + }; + + theURLNode.querySelector('.collapse').addEventListener( + 'click', + toggleCollapse + ); + theURLNode.querySelector('.expand').addEventListener( + 'click', + toggleCollapse + ); })(); /******************************************************************************/ @@ -161,8 +163,8 @@ vAPI.messaging.send('main-blocked.js', { what: 'mustBlock', scope: details.hn, hostname: details.hn, - type: 'doc' -}, function(response) { + type: details.type +}, response => { if ( response === false ) { window.location.replace(details.url); } diff --git a/src/js/traffic.js b/src/js/traffic.js index 05dc026..ff9fb42 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -35,6 +35,7 @@ var onBeforeRootFrameRequestHandler = function(details) { let µm = µMatrix; let desURL = details.url; let desHn = µm.URI.hostnameFromURI(desURL); + let type = requestTypeNormalizer[details.type] || 'other'; let tabId = details.tabId; µm.tabContextManager.push(tabId, desURL); @@ -43,13 +44,13 @@ var onBeforeRootFrameRequestHandler = function(details) { let srcHn = tabContext.rootHostname; // Disallow request as per matrix? - let blocked = µm.mustBlock(srcHn, desHn, 'doc'); + let blocked = µm.mustBlock(srcHn, desHn, type); let pageStore = µm.pageStoreFromTabId(tabId); - pageStore.recordRequest('doc', desURL, blocked); + pageStore.recordRequest(type, desURL, blocked); pageStore.perLoadAllowedRequestCount = 0; pageStore.perLoadBlockedRequestCount = 0; - µm.logger.writeOne({ tabId, srcHn, desHn, desURL, type: 'doc', blocked }); + µm.logger.writeOne({ tabId, srcHn, desHn, desURL, type, blocked }); // Not blocked if ( !blocked ) { @@ -62,7 +63,7 @@ var onBeforeRootFrameRequestHandler = function(details) { } // Blocked - let query = btoa(JSON.stringify({ url: desURL, hn: desHn, why: '?' })); + let query = btoa(JSON.stringify({ url: desURL, hn: desHn, type, why: '?' })); vAPI.tabs.replace(tabId, vAPI.getURL('main-blocked.html?details=') + query); @@ -343,12 +344,18 @@ var onHeadersReceived = function(details) { let µm = µMatrix, tabId = details.tabId, requestURL = details.url, - requestType = requestTypeNormalizer[details.type] || 'other'; + requestType = requestTypeNormalizer[details.type] || 'other', + headers = details.responseHeaders; // https://github.com/gorhill/uMatrix/issues/145 // Check if the main_frame is a download if ( requestType === 'doc' ) { µm.tabContextManager.push(tabId, requestURL); + let contentType = typeFromHeaders(headers); + if ( contentType !== undefined ) { + details.type = contentType; + return onBeforeRootFrameRequestHandler(details); + } } let tabContext = µm.tabContextManager.lookup(tabId); @@ -382,7 +389,6 @@ var onHeadersReceived = function(details) { // if the current environment does not support merging headers: // Firefox 58/webext and less can't merge CSP headers, so we will merge // them here. - var headers = details.responseHeaders; if ( csp.length !== 0 ) { let cspRight = csp.join(', '); @@ -465,6 +471,20 @@ var headerIndexFromName = function(headerName, headers) { /******************************************************************************/ +// Extract request type from content headers. + +let typeFromHeaders = function(headers) { + let i = headerIndexFromName('content-type', headers); + if ( i === -1 ) { return; } + let mime = headers[i].value.toLowerCase(); + if ( mime.startsWith('image/') ) { return 'image'; } + if ( mime.startsWith('video/') || mime.startsWith('audio/') ) { + return 'media'; + } +}; + +/******************************************************************************/ + var requestTypeNormalizer = { 'font' : 'css', 'image' : 'image', diff --git a/src/main-blocked.html b/src/main-blocked.html index bcebfba..cd3fc2f 100644 --- a/src/main-blocked.html +++ b/src/main-blocked.html @@ -1,119 +1,23 @@ + - - + + + -
+
exclamation-triangle

@@ -129,6 +33,7 @@ body[dir="rtl"] #theURL > p > span {

+