pull/2/head
gorhill 10 years ago
parent 193b469ffe
commit 806d89e443

@ -71,6 +71,17 @@ vAPI.noTabId = '-1';
/******************************************************************************/ /******************************************************************************/
var onCreatedNavigationTarget = function(details) {
vAPI.tabs.onPopup({
openerTabId: details.sourceTabId,
openerURL: '',
targetURL: details.url,
targetTabId: details.tabId
});
};
/******************************************************************************/
vAPI.tabs.registerListeners = function() { vAPI.tabs.registerListeners = function() {
if ( typeof this.onNavigation === 'function' ) { if ( typeof this.onNavigation === 'function' ) {
chrome.webNavigation.onCommitted.addListener(this.onNavigation); chrome.webNavigation.onCommitted.addListener(this.onNavigation);
@ -85,7 +96,7 @@ vAPI.tabs.registerListeners = function() {
} }
if ( typeof this.onPopup === 'function' ) { if ( typeof this.onPopup === 'function' ) {
chrome.webNavigation.onCreatedNavigationTarget.addListener(this.onPopup); chrome.webNavigation.onCreatedNavigationTarget.addListener(onCreatedNavigationTarget);
} }
}; };
@ -493,15 +504,6 @@ vAPI.net.registerListeners = function() {
this.onBeforeRequest.extra this.onBeforeRequest.extra
); );
chrome.webRequest.onBeforeSendHeaders.addListener(
this.onBeforeSendHeaders.callback,
{
'urls': this.onBeforeSendHeaders.urls || ['<all_urls>'],
'types': this.onBeforeSendHeaders.types || []
},
this.onBeforeSendHeaders.extra
);
var onHeadersReceivedClient = this.onHeadersReceived.callback; var onHeadersReceivedClient = this.onHeadersReceived.callback;
var onHeadersReceived = function(details) { var onHeadersReceived = function(details) {
normalizeRequestDetails(details); normalizeRequestDetails(details);
@ -515,6 +517,56 @@ vAPI.net.registerListeners = function() {
}, },
this.onHeadersReceived.extra this.onHeadersReceived.extra
); );
// Intercept root frame requests.
// This is where we identify and block popups early, whenever possible.
var onBeforeSendHeaders = function(details) {
// Do not block behind the scene requests.
if ( vAPI.isNoTabId(details.tabId) ) {
return;
}
// Only root document.
if ( details.parentFrameId !== -1 ) {
return;
}
var referrer = headerValue(details.requestHeaders, 'referer');
if ( referrer === '' ) {
return;
}
var result = vAPI.tabs.onPopup({
openerTabId: undefined,
openerURL: referrer,
targetTabId: details.tabId,
targetURL: details.url
});
if ( result ) {
return { 'cancel': true };
}
};
var headerValue = function(headers, name) {
var i = headers.length;
while ( i-- ) {
if ( headers[i].name.toLowerCase() === name ) {
return headers[i].value;
}
}
return '';
};
chrome.webRequest.onBeforeSendHeaders.addListener(
onBeforeSendHeaders,
{
'urls': [ 'http://*/*', 'https://*/*' ],
'types': [ 'main_frame' ]
},
[ 'blocking', 'requestHeaders' ]
);
}; };
/******************************************************************************/ /******************************************************************************/

Loading…
Cancel
Save