diff options
| author | Einar Egilsson <einar@einaregilsson.com> | 2009-10-16 07:23:54 +0000 | 
|---|---|---|
| committer | Einar Egilsson <einar@einaregilsson.com> | 2009-10-16 07:23:54 +0000 | 
| commit | 6177295e1d9a9ebba5acc68df4800d8557b22cab (patch) | |
| tree | 66a670cd5f54f6ee06d2ecb06c7751cee4463e85 | |
| parent | 9266c7831e5e4d0f4e123bd62e6cc0a2d114038f (diff) | |
Before using XPCOMUtils
git-svn-id: http://einaregilsson.googlecode.com/svn/mozilla/redirector/trunk@269 119bf307-c92d-0410-89bd-8f53e6181181
| -rw-r--r-- | chrome/content/code/redirector.prototype.js | 62 | ||||
| -rw-r--r-- | chrome/content/log.html | 7 | ||||
| -rw-r--r-- | components/redirector.component.js | 35 | 
3 files changed, 84 insertions, 20 deletions
| diff --git a/chrome/content/code/redirector.prototype.js b/chrome/content/code/redirector.prototype.js index b69a52f..979e9f7 100644 --- a/chrome/content/code/redirector.prototype.js +++ b/chrome/content/code/redirector.prototype.js @@ -70,6 +70,7 @@ Redirector.prototype = {      // nsIContentPolicy interface implementation
      shouldLoad: function(contentType, contentLocation, requestOrigin, aContext, mimeTypeGuess, extra) {
  	    try {
 +	    
  		    if (!this.prefs.enabled) {
  	            return nsIContentPolicy.ACCEPT;
  	        }
 @@ -90,7 +91,6 @@ Redirector.prototype = {  	        var url = contentLocation.spec;
  	        for each (var redirect in this.list) {
 -		        //this.debug(redirect);
  	            var result = redirect.getMatch(url);
  	            if (result.isExcludeMatch) {
  		        	this.debug(url + ' matched exclude pattern ' + redirect.excludePattern + ' so the redirect ' + redirect.includePattern + ' will not be used');
 @@ -114,6 +114,60 @@ Redirector.prototype = {          return nsIContentPolicy.ACCEPT;
      },
 +    //nsIChannelEventSink interface implementation
 +	onChannelRedirect: function(oldChannel, newChannel, flags)
 +	{
 +		dump("****************** HI THERE ****************************");
 +		//throw Cr.NS_BASE_STREAM_WOULD_BLOCK;
 +/*
 +		try {
 +			let oldLocation = null;
 +			let newLocation = null;
 +			try {
 +				oldLocation = oldChannel.originalURI.spec;
 +				newLocation = newChannel.URI.spec;
 +			}
 +			catch(e2) {}
 +
 +			if (!oldLocation || !newLocation || oldLocation == newLocation)
 +				return;
 +
 +			// Look for the request both in the origin window and in its parent (for frames)
 +			let contexts = [getRequestWindow(newChannel)];
 +			if (!contexts[0])
 +				contexts.pop();
 +			else if (contexts[0] && contexts[0].parent != contexts[0])
 +				contexts.push(contexts[0].parent);
 +
 +			let info = null;
 +			for each (let context in contexts)
 +			{
 +				// Did we record the original request in its own window?
 +				let data = RequestList.getDataForWindow(context, true);
 +				if (data)
 +					info = data.getURLInfo(oldLocation);
 +
 +				if (info)
 +				{
 +					let nodes = info.nodes;
 +					let node = (nodes.length > 0 ? nodes[nodes.length - 1] : context.document);
 +
 +					// HACK: NS_BINDING_ABORTED would be proper error code to throw but this will show up in error console (bug 287107)
 +					if (!this.processNode(context, node, info.type, newChannel.URI))
 +						throw Cr.NS_BASE_STREAM_WOULD_BLOCK;
 +					else
 +						return;
 +				}
 +			}
 +		}
 +		catch (e if (e != Cr.NS_BASE_STREAM_WOULD_BLOCK))
 +		{
 +			// We shouldn't throw exceptions here - this will prevent the redirect.
 +			dump("Adblock Plus: Unexpected error in policy.onChannelRedirect: " + e + "\n");
 +		}
 +		*/
 +	},
 +		
      reload : function() {
  		loader.loadSubScript('chrome://redirector/content/code/redirector.prototype.js');
  		loader.loadSubScript('chrome://redirector/content/code/redirect.js');
 @@ -185,12 +239,6 @@ Redirector.prototype = {  	containsRedirect : function(redirect) {
  		for each (var existing in this.list) {
 -			this.debug("EXAMPLEURL: " + (redirect.exampleUrl == existing.exampleUrl));
 -			this.debug("INCLUDEPATTERN: " + (redirect.includePattern == existing.includePattern));
 -			this.debug("EXCLUDEPATTERN: " + (redirect.excludePattern == existing.excludePattern));
 -			this.debug("unescape: " + (redirect.unescapeMatches == existing.unescapeMatches));
 -			this.debug("REDIRECTTO: " + (redirect.redirectUrl == existing.redirectUrl));
 -			this.debug("PATTERNTYPE: " + (redirect.patternType == existing.patternType));
  			if (existing.equals(redirect)) {
  				return true;
  			}	
 diff --git a/chrome/content/log.html b/chrome/content/log.html index a70d9f4..a4f04d1 100644 --- a/chrome/content/log.html +++ b/chrome/content/log.html @@ -13,7 +13,12 @@  					var prefix = 'REDIRECTOR:';
  					if (msg.message.substr(0, prefix.length) == prefix)
  					{
 -						document.body.innerHTML += msg.message.substr(prefix.length) + '<br>';
 +						if (document) {
 +							document.body.innerHTML += msg.message.substr(prefix.length) + '<br>';
 +						} else {
 +							//Been destroyed and we're still getting message, lets try to unsubscribe...
 +							try { unload(); } catch(e) {}	
 +						}
  					}
  				}
  			};
 diff --git a/components/redirector.component.js b/components/redirector.component.js index eeb6b39..bebae88 100644 --- a/components/redirector.component.js +++ b/components/redirector.component.js @@ -30,17 +30,21 @@ var redirectorInstance = null;  const factory = {
      // nsIFactory interface implementation
      createInstance: function(outer, iid) {
 -        if (outer != null) {
 -           Components.returnCode = Cr.NS_ERROR_NO_AGGREGATION;
 -           return null;
 -       }
 -        if (!iid.equals(Ci.nsIContentPolicy) &&
 -                !iid.equals(Ci.nsISupports)) {
 +		if (outer != null) {
 +			Components.returnCode = Cr.NS_ERROR_NO_AGGREGATION;
 +			return null;
 +		}
 +	    dump("\n\nCreateInstance:\n");
 +        if (!(iid.equals(Ci.nsIContentPolicy) || iid.equals(Ci.nsISupports) || iid.equals(Ci.nsIChannelEventSink))) {
              Components.returnCode = Cr.NS_ERROR_NO_INTERFACE;          
              return null;
          }
 -
 +        dump("\n  IID: " + iid);
 +        dump("\n");
 +        dump("\n  nsIContentPolicy: " + iid.equals(Ci.nsIContentPolicy));
 +        dump("\n  nsISupports: " + iid.equals(Ci.nsISupports));
 +        dump("\n  nsIChannelEventSink: " + iid.equals(Ci.nsIChannelEventSink));
          if(!redirectorInstance) {
              redirectorInstance = new Redirector();
              redirectorInstance.wrappedJSObject = redirectorInstance;
 @@ -51,9 +55,7 @@ const factory = {      // nsISupports interface implementation
      QueryInterface: function(iid) {
 -        if (iid.equals(Ci.nsISupports) ||
 -                iid.equals(Ci.nsIModule) ||
 -                iid.equals(Ci.nsIFactory)) {
 +        if (iid.equals(Ci.nsISupports) || iid.equals(Ci.nsIModule) || iid.equals(Ci.nsIFactory)) {
              return this;
          }
          Components.returnCode = Cr.NS_ERROR_NO_INTERFACE;          
 @@ -61,28 +63,37 @@ const factory = {      }
  }
 +Redirector.prototype.QueryInterface = function(iid) {
 +    if (iid.equals(Ci.nsISupports) || iid.equals(Ci.nsIChannelEventSink) || iid.equals(Ci.nsIContentPolicy)) {
 +        return this;
 +    }
 +    Components.returnCode = Cr.NS_ERROR_NO_INTERFACE;          
 +    return null;   
 +}
  /*
   * Module object
   */
  const module = {
 -    registerSelf: function(compMgr, fileSpec, location, type) {
 +    registerSelf : function(compMgr, fileSpec, location, type) {
          compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
          compMgr.registerFactoryLocation(CSSB_CID, 
                                          "Redirector content policy",
                                          CSSB_CONTRACTID,
                                          fileSpec, location, type);
 -
          var catman = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
 +        catman.addCategoryEntry("net-channel-event-sinks", CSSB_CONTRACTID, CSSB_CONTRACTID, true, true);
          catman.addCategoryEntry("content-policy", CSSB_CONTRACTID, CSSB_CONTRACTID, true, true);
      },
      unregisterSelf: function(compMgr, fileSpec, location) {
          compMgr.QueryInterface(Ci.nsIComponentRegistrar).unregisterFactoryLocation(CSSB_CID, fileSpec);
          Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager).deleteCategoryEntry("content-policy", CSSB_CONTRACTID, true);
 +        Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager).deleteCategoryEntry("net-channel-event-sinks", CSSB_CONTRACTID, true);
      },
      getClassObject: function(compMgr, cid, iid) {
 +	    dump("\nGetClassObject: " + cid + ", iid: " + iid);
          if (cid.equals(CSSB_CID)) {
              return factory;
          }
 | 
