diff options
Diffstat (limited to 'chrome/content/code')
-rw-r--r-- | chrome/content/code/redirector.prototype.js | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/chrome/content/code/redirector.prototype.js b/chrome/content/code/redirector.prototype.js index f954c5f..74f7e61 100644 --- a/chrome/content/code/redirector.prototype.js +++ b/chrome/content/code/redirector.prototype.js @@ -121,20 +121,44 @@ Redirector.prototype = { },
//nsIChannelEventSink interface implementation
+ //Mostly borrowed from the excellent Adblock Plus extension
onChannelRedirect: function(oldChannel, newChannel, flags)
{
try {
let newLocation = newChannel.URI.spec;
+ if (!(newChannel.loadFlags & Ci.nsIChannel.LOAD_DOCUMENT_URI)) {
+ //We only redirect documents...
+ return;
+ }
if (!newLocation) {
return;
}
-
+ let callbacks = [];
+ if (newChannel.notificationCallbacks) {
+ callbacks.push(newChannel.notificationCallbacks);
+ }
+ if (newChannel.loadGroup && newChannel.loadGroup.notificationCallbacks) {
+ callbacks.push(newChannel.loadGroup.notificationCallbacks);
+ }
+ var win;
+ var webNav;
+ for each (let callback in callbacks)
+ {
+ try {
+ win = callback.getInterface(Ci.nsILoadContext).associatedWindow;
+ webNav = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation);
+ break;
+ } catch(e) {}
+ }
+ if (!webNav) {
+ return;
+ }
var redirectUrl = this.getRedirectUrl(newLocation);
if (redirectUrl) {
- throw Cr.NS_BASE_STREAM_WOULD_BLOCK;
- //TODO: Get window
+ webNav.loadURI(redirectUrl,null,null,null,null);
+ throw Cr.NS_BASE_STREAM_WOULD_BLOCK; //Throw this because the real error we should throw shows up in console...
}
} catch (e if (e != Cr.NS_BASE_STREAM_WOULD_BLOCK)) {
|