From 0225b1c8035a1c03dafa4c971d21facc76dbc2de Mon Sep 17 00:00:00 2001 From: Einar Egilsson Date: Mon, 14 Sep 2009 21:19:32 +0000 Subject: Moved component implementation into chrome folder git-svn-id: http://einaregilsson.googlecode.com/svn/mozilla/redirector/trunk@246 119bf307-c92d-0410-89bd-8f53e6181181 --- components/redirector.js | 272 +++-------------------------------------------- 1 file changed, 14 insertions(+), 258 deletions(-) (limited to 'components/redirector.js') diff --git a/components/redirector.js b/components/redirector.js index 4e44c11..d0d9694 100644 --- a/components/redirector.js +++ b/components/redirector.js @@ -2,269 +2,25 @@ const CSSB_CONTRACTID = "@einaregilsson.com/redirector;1"; const CSSB_CID = Components.ID("{b7a7a54f-0581-47ff-b086-d6920cb7a3f7}"); -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cr = Components.results; -const kRedirectorWildcard = 'W'; -const kRedirectorRegex= 'R'; +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cr = Components.results; +var kRedirectorWildcard = 'W'; +var kRedirectorRegex= 'R'; +var nsIContentPolicy = Ci.nsIContentPolicy; -const nsIContentPolicy = Ci.nsIContentPolicy; function RedirectorPolicy() { - this.prefBranch = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.redirector."); - - //Check if we need to update existing redirects - - var data = this.prefBranch.getCharPref('redirects'); - var version = this.prefBranch.getCharPref('version'); - this.debugEnabled = this.prefBranch.getBoolPref('debug'); - this.enabled = this.prefBranch.getBoolPref('enabled'); - this.loadStrings(); - //Here update checks are handled - if (version == 'undefined') { //Either a fresh install of Redirector, or first time install of v2.0 - if (data) { //There is some data in redirects, we are upgrading from a previous version, need to upgrade data - var tempList = eval(data); - var arr; - var newArr = [] - for each (arr in tempList) { - if (arr.length == 5) { - arr.push(''); //For those that don't have an exclude pattern. Backwards compatibility is a bitch! - } - arr.splice(3,1); //Remove the "only if link exists" data - newArr.push(arr.join(',,,')); - } - this.prefBranch.setCharPref('redirects', newArr.join(':::')); - } - this.prefBranch.setCharPref('version', '2.0'); - } - //Update finished - - //Now get from the new format - data = this.prefBranch.getCharPref('redirects'); - var arr; - this.list = []; - if (data != '') { - for each (redirectString in data.split(':::')) { - arr = redirectString.split(',,,'); - this.list.push({ - exampleUrl : arr[0], - pattern : arr[1], - redirectUrl : arr[2], - patternType : arr[3], - excludePattern : arr[4], - unescapeMatches : !!arr[5] //This might be undefined for those upgrading from 1.7.1 but that's ok - }); - } - } + this.init(); } -RedirectorPolicy.prototype = { - prefBranch : null, - list : null, - strings : null, - cout : Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService), - - loadStrings : function() { - var src = 'chrome://redirector/locale/redirector.properties'; - var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"].getService(Ci.nsILocaleService); - var appLocale = localeService.getApplicationLocale(); - var stringBundleService = Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService); - this.strings = stringBundleService.createBundle(src, appLocale); - }, - - debug : function(msg) { - if (this.debugEnabled) { - this.cout.logStringMessage('REDIRECTOR: ' + msg); - } - }, - - // nsIContentPolicy interface implementation - shouldLoad: function(contentType, contentLocation, requestOrigin, aContext, mimeTypeGuess, extra) { - if (!this.enabled) { - return nsIContentPolicy.ACCEPT; - } - if (contentLocation.scheme != "http" && contentLocation.scheme != "https") { - return nsIContentPolicy.ACCEPT; - } - - if (contentType != nsIContentPolicy.TYPE_DOCUMENT) { - return nsIContentPolicy.ACCEPT; - } - - if (!aContext || !aContext.loadURI) { - return nsIContentPolicy.ACCEPT; - } - this.debug("CHECK: " + contentLocation.spec); - - var url = contentLocation.spec; - - for each (var redirect in this.list) { - var redirectUrl = this.getRedirectUrl(url, redirect); - if (redirectUrl) { - redirectUrl = this.makeAbsoluteUrl(url, redirectUrl); - this.debug('Redirecting ' + url + ' to ' + redirectUrl); - aContext.loadURI(redirectUrl, requestOrigin, null); - return nsIContentPolicy.REJECT_REQUEST; - } - } - return nsIContentPolicy.ACCEPT; - }, - - shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) { - return nsIContentPolicy.ACCEPT; - }, - - setEnabled : function(val) { - this.enabled = val; - this.prefBranch.setBoolPref('enabled', val); - }, - - reload : function() { - //TODO: Reload implementation - }, - - addRedirect : function(redirect) { - this.list.push(redirect); - this.save(); - }, - - deleteAt : function(index) { - this.list.splice(index, 1); - this.save(); - }, - - save : function() { - var r - , tempList = []; - - for each (r in this.list) { - tempList.push([r.exampleUrl, r.pattern, r.redirectUrl, r.patternType, r.excludePattern, r.unescapeMatches].join(',,,')); - } - this.prefBranch.setCharPref('redirects', tempList.join(':::')); - }, - - getBoolPref : function(name) { - return this.prefBranch.getBoolPref(name); - }, - - regexMatch : function(pattern, text, redirectUrl, unescapeMatches) { - - if (!pattern) { - return null; - } - var strings, rx, match; - try { - rx = new RegExp(pattern, 'gi'); - match = rx.exec(text); - } catch(e) { - this.msgBox(this.strings.GetStringFromName('extensionName'), this.strings.formatStringFromName('regexPatternError', [pattern, e.toString()],2)); - return null; - } - - var rxrepl; - - if (match) { - for (var i = 1; i < match.length; i++) { - rxrepl = new RegExp('\\$' + i, 'gi'); - redirectUrl = redirectUrl.replace(rxrepl, unescapeMatches ? unescape(match[i]) : match[i]); - } - return redirectUrl; - } - - return null; - - }, - - msgBox : function(title, text) { - Cc["@mozilla.org/embedcomp/prompt-service;1"] - .getService(Ci.nsIPromptService) - .alert(null, title, text); - }, - - getRedirectUrl: function(url, redirect) { - - if (redirect.patternType == kRedirectorWildcard) { - if (this.wildcardMatch(redirect.excludePattern, url, 'whatever')) { - this.debug(url + ' matches exclude pattern ' + redirect.excludePattern); - return null; - } - return this.wildcardMatch(redirect.pattern, url, redirect.redirectUrl, redirect.unescapeMatches); - } else if (redirect.patternType == kRedirectorRegex) { - if (this.regexMatch(redirect.excludePattern, url, 'whatever')) { - this.debug(url + ' matches exclude pattern ' + redirect.excludePattern); - return null; - } - return this.regexMatch(redirect.pattern, url, redirect.redirectUrl, redirect.unescapeMatches); - } - return null; - }, - - makeAbsoluteUrl : function(currentUrl, relativeUrl) { - - if (relativeUrl.match(/https?:/)) { - return relativeUrl; - } - - var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); - //this.debug(currentUrl); - var uri = ioService.newURI(currentUrl, null, null); - - return uri.resolve(relativeUrl); - }, - - wildcardMatch : function(pattern, text, redirectUrl, unescapeMatches) { - var parts - , part - , i - , pos - , originalText - , stars; - - if (!pattern) { - return null; - } - parts = pattern.split('*'); - - stars = []; - originalText = text; - var starStart = -1; - - for (i in parts) { - - part = parts[i]; - - pos = text.lastIndexOf(part); - - if (pos == -1) { - return null; - } - - if (i == 0 && pos != 0) { - return null; - } - - if (i == parts.length -1 && i != "" && text.substr(text.length - part.length) != part) { - return null; - } - - if (i == 0) { - //Do nothing, part will be added on next run - } else if (i == parts.length-1 && parts[i] == '') { - stars.push(unescapeMatches ? unescape(text) : text); - } else { - stars.push(unescapeMatches ? unescape(text.substr(0, pos)) : text.substr(0, pos)); - } - - text = text.substr(pos + part.length); - } - - for (var i = 1; i <= stars.length; i++) { - redirectUrl = redirectUrl.replace(new RegExp('\\$' + i, 'gi'), stars[i-1]); - } - - return redirectUrl; - } -}; +try { +Cc["@mozilla.org/moz/jssubscript-loader;1"] + .getService(Ci.mozIJSSubScriptLoader) + .loadSubScript('chrome://redirector/content/redirector.prototype.js'); +}catch(e) { +Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(e); +} /* * Factory object */ -- cgit v1.2.3-70-g09d2