1
0
mirror of https://github.com/gorhill/uBlock.git synced 2024-09-18 08:52:26 +02:00

fine tuning #257, code review, jshint

This commit is contained in:
gorhill 2014-09-28 14:38:17 -04:00
parent 5c91180b89
commit f0c2285dae
8 changed files with 98 additions and 43 deletions

View File

@ -115,7 +115,9 @@ return {
noopFunc: function(){}, noopFunc: function(){},
apiErrorCount: 0, apiErrorCount: 0,
elementPickerTarget: '', contextMenuTarget: '',
contextMenuClientX: -1,
contextMenuClientY: -1,
// so that I don't have to care for last comma // so that I don't have to care for last comma
dummy: 0 dummy: 0

View File

@ -766,3 +766,24 @@ var uBlockMessaging = (function(name){
})(); })();
/******************************************************************************/ /******************************************************************************/
/******************************************************************************/
// To send mouse coordinates to context menu handler, as the chrome API fails
// to provide the mouse position to context menu listeners.
// This could be inserted in its own content script, but it's so simple that
// I feel it's not worth the overhead.
// Ref.: https://developer.mozilla.org/en-US/docs/Web/Events/contextmenu
(function() {
var onContextMenu = function(ev) {
uBlockMessaging.tell({
what: 'contextMenuEvent',
clientX: ev.clientX,
clientY: ev.clientY
});
};
document.addEventListener('contextmenu', onContextMenu);
})();
/******************************************************************************/

View File

@ -19,7 +19,7 @@
Home: https://github.com/gorhill/uBlock Home: https://github.com/gorhill/uBlock
*/ */
/* global */ /* global chrome, µBlock */
/******************************************************************************/ /******************************************************************************/
@ -63,10 +63,6 @@ var onContextMenuClicked = function(details, tab) {
src = details.linkUrl; src = details.linkUrl;
} }
if ( src === '' ) {
return;
}
µb.elementPickerExec(tab.id, tagName + '\t' + src); µb.elementPickerExec(tab.id, tagName + '\t' + src);
}; };
@ -78,7 +74,7 @@ var toggleMenu = function(on) {
var menuCreateDetails = { var menuCreateDetails = {
id: 'blockElement', id: 'blockElement',
title: chrome.i18n.getMessage('pickerContextMenuEntry'), title: chrome.i18n.getMessage('pickerContextMenuEntry'),
contexts: ['frame', 'link', 'image', 'video'], contexts: ['page', 'frame', 'link', 'image', 'video'],
documentUrlPatterns: ['https://*/*', 'http://*/*'] documentUrlPatterns: ['https://*/*', 'http://*/*']
}; };

View File

@ -544,7 +544,6 @@ var candidateFromFilterChoice = function(filterChoice) {
// Return path: the target element, then all siblings prepended // Return path: the target element, then all siblings prepended
var selector = []; var selector = [];
var filter;
for ( ; slot < filters.length; slot++ ) { for ( ; slot < filters.length; slot++ ) {
filter = filters[slot]; filter = filters[slot];
selector.unshift(filter.replace(/^##/, '')); selector.unshift(filter.replace(/^##/, ''));
@ -669,27 +668,37 @@ var showDialog = function(options) {
/******************************************************************************/ /******************************************************************************/
var onSvgHovered = function(ev) { var elementFromPoint = function(x, y) {
if ( pickerPaused() ) {
return;
}
svgRoot.style.pointerEvents = 'none'; svgRoot.style.pointerEvents = 'none';
var elem = document.elementFromPoint(ev.clientX, ev.clientY); var elem = document.elementFromPoint(x, y);
if ( elem == document.body || elem === document.documentElement ) { if ( elem === document.body || elem === document.documentElement ) {
elem = null; elem = null;
} }
highlightElements(elem ? [elem] : []);
svgRoot.style.pointerEvents = 'auto'; svgRoot.style.pointerEvents = 'auto';
return elem;
}; };
/******************************************************************************/ /******************************************************************************/
var onSvgClicked = function() { var onSvgHovered = function(ev) {
if ( pickerPaused() ) { if ( pickerPaused() ) {
return; return;
} }
filtersFromElement(targetElements[0]); var elem = elementFromPoint(ev.clientX, ev.clientY);
highlightElements(elem ? [elem] : []);
};
/******************************************************************************/
var onSvgClicked = function(ev) {
if ( pickerPaused() ) {
return;
}
var elem = elementFromPoint(ev.clientX, ev.clientY);
if ( elem === null ) {
return;
}
filtersFromElement(elem);
showDialog(); showDialog();
}; };
@ -709,7 +718,7 @@ var onKeyPressed = function(ev) {
// May need to dynamically adjust the height of the overlay + new position // May need to dynamically adjust the height of the overlay + new position
// of highlighted elements. // of highlighted elements.
var onScrolled = function(ev) { var onScrolled = function() {
var newHeight = this.scrollY + this.innerHeight; var newHeight = this.scrollY + this.innerHeight;
if ( newHeight > svgHeight ) { if ( newHeight > svgHeight ) {
svgHeight = newHeight; svgHeight = newHeight;
@ -971,8 +980,19 @@ messaging.ask({ what: 'elementPickerArguments' }, function(details) {
} }
// Auto-select a specific target, if any, and if possible // Auto-select a specific target, if any, and if possible
var targetElement = details.targetElement || ''; var elem;
var pos = targetElement.indexOf('\t');
// Try using mouse position
if ( details.clientX !== -1 ) {
elem = elementFromPoint(details.clientX, details.clientY);
filtersFromElement(elem);
showDialog();
return;
}
// No mouse position available, use suggested target
var target = details.target || '';
var pos = target.indexOf('\t');
if ( pos === -1 ) { if ( pos === -1 ) {
return; return;
} }
@ -983,28 +1003,27 @@ messaging.ask({ what: 'elementPickerArguments' }, function(details) {
'video': 'src', 'video': 'src',
'audio': 'src' 'audio': 'src'
}; };
var tagName = targetElement.slice(0, pos); var tagName = target.slice(0, pos);
var url = targetElement.slice(pos + 1); var url = target.slice(pos + 1);
var attr = srcAttrMap[tagName]; var attr = srcAttrMap[tagName];
if ( attr === undefined ) { if ( attr === undefined ) {
return; return;
} }
var elems = document.querySelectorAll(tagName + '[' + attr + ']'); var elems = document.querySelectorAll(tagName + '[' + attr + ']');
var i = elems.length; var i = elems.length;
var elem, src; var src;
while ( i-- ) { while ( i-- ) {
elem = elems[i]; elem = elems[i];
src = elem.getAttribute(attr); src = elem[attr];
if ( src === null || src === '' ) { if ( typeof src !== 'string' || src === '' ) {
continue; continue;
} }
urlNormalizer.href = src; if ( src !== url ) {
src = urlNormalizer.href; continue;
if ( src === url ) {
filtersFromElement(elem);
showDialog({ modifier: true });
break;
} }
filtersFromElement(elem);
showDialog({ modifier: true });
return;
} }
}); });

View File

@ -307,9 +307,13 @@ var onMessage = function(request, sender, callback) {
cosmeticFilters: chrome.i18n.getMessage('pickerCosmeticFilters'), cosmeticFilters: chrome.i18n.getMessage('pickerCosmeticFilters'),
cosmeticFiltersHint: chrome.i18n.getMessage('pickerCosmeticFiltersHint') cosmeticFiltersHint: chrome.i18n.getMessage('pickerCosmeticFiltersHint')
}, },
targetElement: µb.elementPickerTarget target: µb.contextMenuTarget,
clientX: µb.contextMenuClientX,
clientY: µb.contextMenuClientY
}; };
µb.elementPickerTarget = ''; µb.contextMenuTarget = '';
µb.contextMenuClientX = -1;
µb.contextMenuClientY = -1;
break; break;
case 'createUserFilter': case 'createUserFilter':

View File

@ -137,13 +137,15 @@ var onMessage = function(request, port) {
// Default is for commonly used messages. // Default is for commonly used messages.
function defaultHandler(request, sender, callback) { function defaultHandler(request, sender, callback) {
var µb = µBlock;
// Async // Async
switch ( request.what ) { switch ( request.what ) {
case 'getAssetContent': case 'getAssetContent':
return µBlock.assets.getLocal(request.url, callback); return µb.assets.getLocal(request.url, callback);
case 'loadUbiquitousAllowRules': case 'loadUbiquitousAllowRules':
return µBlock.loadUbiquitousWhitelists(); return µb.loadUbiquitousWhitelists();
default: default:
break; break;
@ -153,28 +155,33 @@ function defaultHandler(request, sender, callback) {
var response; var response;
switch ( request.what ) { switch ( request.what ) {
case 'contextMenuEvent':
µb.contextMenuClientX = request.clientX;
µb.contextMenuClientY = request.clientY;
break;
case 'forceReloadTab': case 'forceReloadTab':
µBlock.forceReload(request.pageURL); µb.forceReload(request.pageURL);
break; break;
case 'getUserSettings': case 'getUserSettings':
response = µBlock.userSettings; response = µb.userSettings;
break; break;
case 'gotoExtensionURL': case 'gotoExtensionURL':
µBlock.utils.gotoExtensionURL(request.url); µb.utils.gotoExtensionURL(request.url);
break; break;
case 'gotoURL': case 'gotoURL':
µBlock.utils.gotoURL(request); µb.utils.gotoURL(request);
break; break;
case 'reloadAllFilters': case 'reloadAllFilters':
µBlock.reloadPresetBlacklists(request.switches, request.update); µb.reloadPresetBlacklists(request.switches, request.update);
break; break;
case 'userSettings': case 'userSettings':
response = µBlock.changeUserSettings(request.name, request.value); response = µb.changeUserSettings(request.name, request.value);
break; break;
default: default:

View File

@ -246,7 +246,7 @@
µBlock.elementPickerExec = function(tabId, targetElement) { µBlock.elementPickerExec = function(tabId, targetElement) {
this.elementPickerTarget = targetElement || ''; this.elementPickerTarget = targetElement || '';
chrome.tabs.executeScript(tabId, { file: 'js/element-picker.js' }); this.XAL.injectScript(tabId, { file: 'js/element-picker.js' });
}; };
/******************************************************************************/ /******************************************************************************/

View File

@ -53,6 +53,12 @@ exports.setIcon = function(id, imgDict, overlayStr) {
/******************************************************************************/ /******************************************************************************/
exports.injectScript = function(id, details) {
chrome.tabs.executeScript(id, details);
};
/******************************************************************************/
return exports; return exports;
/******************************************************************************/ /******************************************************************************/