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
-
+
+
+ search-plus
+ search-minus
+
@@ -129,6 +33,7 @@ body[dir="rtl"] #theURL > p > span {
+