This commit is contained in:
gorhill 2015-03-30 17:42:12 -04:00
parent eb27478cc7
commit 5b34efc55e
5 changed files with 81 additions and 6 deletions

View File

@ -319,9 +319,6 @@ vAPI.tabs.open = function(details) {
vAPI.tabs.replace = function(tabId, url) { vAPI.tabs.replace = function(tabId, url) {
var targetURL = url; var targetURL = url;
if ( typeof targetURL !== 'string' || targetURL === '' ) {
return;
}
// extension pages // extension pages
if ( /^[\w-]{2,}:/.test(targetURL) !== true ) { if ( /^[\w-]{2,}:/.test(targetURL) !== true ) {
@ -340,7 +337,6 @@ vAPI.tabs.replace = function(tabId, url) {
if ( chrome.runtime.lastError ) { if ( chrome.runtime.lastError ) {
return; return;
} }
}); });
}; };

View File

@ -377,6 +377,24 @@
/******************************************************************************/ /******************************************************************************/
// Replace the URL of a tab. Noop if the tab does not exist.
vAPI.tabs.replace = function(tabId, url) {
var targetURL = url;
// extension pages
if ( /^[\w-]{2,}:/.test(targetURL) !== true ) {
targetURL = vAPI.getURL(targetURL);
}
var tab = this.stack[tabId];
if ( tab ) {
tab.url = targetURL;
}
};
/******************************************************************************/
vAPI.tabs.remove = function(tabIds) { vAPI.tabs.remove = function(tabIds) {
if(tabIds instanceof SafariBrowserTab) { if(tabIds instanceof SafariBrowserTab) {
tabIds = this.getTabId(tabIds); tabIds = this.getTabId(tabIds);

View File

@ -96,6 +96,8 @@ if ( window.history.length > 1 ) {
uDom('#proceedTemporary').attr('href', details.url).on('click', proceedTemporary); uDom('#proceedTemporary').attr('href', details.url).on('click', proceedTemporary);
uDom('#proceedPermanent').attr('href', details.url).on('click', proceedPermanent); uDom('#proceedPermanent').attr('href', details.url).on('click', proceedPermanent);
/******************************************************************************/
})(); })();
/******************************************************************************/ /******************************************************************************/

View File

@ -96,8 +96,8 @@ var reURLPostHostnameAnchors = /[\/?#]/;
var pageHostnameRegister = ''; var pageHostnameRegister = '';
var requestHostnameRegister = ''; var requestHostnameRegister = '';
var filterRegister = null; //var filterRegister = null;
var categoryRegister = ''; //var categoryRegister = '';
/******************************************************************************/ /******************************************************************************/

View File

@ -219,6 +219,11 @@ var onBeforeRootFrameRequest = function(details) {
// Filtering // Filtering
if ( result === '' && µb.getNetFilteringSwitch(requestURL) ) { if ( result === '' && µb.getNetFilteringSwitch(requestURL) ) {
result = µb.staticNetFilteringEngine.matchString(context); result = µb.staticNetFilteringEngine.matchString(context);
// https://github.com/gorhill/uBlock/issues/1128
// Do not block if the match begins after the hostname.
if ( result !== '' ) {
result = toBlockDocResult(requestURL, requestHostname, result);
}
} }
// Log // Log
@ -246,6 +251,60 @@ var onBeforeRootFrameRequest = function(details) {
/******************************************************************************/ /******************************************************************************/
var toBlockDocResult = function(url, hostname, result) {
if ( result.charAt(1) !== 'b' ) {
return '';
}
// Quick test: if the result starts with `|` or `||`, then this means the
// match is before the path part of the URL for sure.
// Examples: sb:|http:// sb:||example.com^
if ( result.charAt(3) === '|' ) {
return result;
}
// Make a regex out of the result
var reText = result.slice(3);
var pos = reText.indexOf('$');
if ( pos > 0 ) {
reText = reText.slice(0, pos);
}
// Matches whole URL
if ( reText === '*' ) {
return result;
}
// We are going to have to take the long way to find out
if ( reText.charAt(0) === '/' && reText.slice(-1) === '/' ) {
reText = reText.slice(1, -1);
} else {
reText = reText
.replace(/\./g, '\\.')
.replace(/\?/g, '\\?')
.replace(/^\|\|/, '')
.replace(/\^/g, '.')
.replace(/^\|/g, '^')
.replace(/\|$/g, '$')
.replace(/\*/g, '.*');
}
var re = new RegExp(reText, 'gi');
var matches = re.exec(url);
if ( matches === null ) {
return '';
}
// verify that the match starts before the path
if ( matches.index < url.indexOf(hostname) + hostname.length ) {
return result;
}
return '';
};
/******************************************************************************/
// Intercept and filter behind-the-scene requests. // Intercept and filter behind-the-scene requests.
var onBeforeBehindTheSceneRequest = function(details) { var onBeforeBehindTheSceneRequest = function(details) {