From 1059664ff4a3c92b2c6a4720f695e158aed215e4 Mon Sep 17 00:00:00 2001 From: Einar Egilsson Date: Tue, 20 Oct 2009 13:04:15 +0000 Subject: Changed to use actual interfaces! Seems to work, tiny bug left in unit tests. git-svn-id: http://einaregilsson.googlecode.com/svn/mozilla/redirector/trunk@285 119bf307-c92d-0410-89bd-8f53e6181181 --- chrome/content/code/browserOverlay.xul.js | 12 +- chrome/content/code/editRedirect.xul.js | 2 - chrome/content/code/prefs.js | 3 +- chrome/content/code/redirect.js | 241 ++++++++++--------- chrome/content/code/redirector.prototype.js | 357 +++++++++++++++------------- chrome/content/code/settings.xul.js | 95 ++++---- chrome/content/ui/browserOverlay.xul | 1 + chrome/content/ui/settings.xul | 1 + chrome/content/unittest/run.html | 2 +- chrome/content/unittest/testcases.js | 5 +- 10 files changed, 391 insertions(+), 328 deletions(-) (limited to 'chrome/content') diff --git a/chrome/content/code/browserOverlay.xul.js b/chrome/content/code/browserOverlay.xul.js index 28047b1..2a6fbac 100644 --- a/chrome/content/code/browserOverlay.xul.js +++ b/chrome/content/code/browserOverlay.xul.js @@ -1,10 +1,11 @@ //// $Id$ -var Redirector = Components.classes["@einaregilsson.com/redirector;1"].getService(Components.interfaces.nsISupports).wrappedJSObject; +var Redirector = Components.classes["@einaregilsson.com/redirector;1"].getService(Components.interfaces.rdIRedirector); var RedirectorOverlay = { strings : null, + prefs : null, onLoad : function(event) { try { @@ -14,8 +15,9 @@ var RedirectorOverlay = { .addEventListener("popupshowing", function(e) { RedirectorOverlay.showContextMenu(e); }, false); this.strings = document.getElementById("redirector-strings"); - this.changedPrefs(Redirector.prefs); - Redirector.prefs.addListener(this); + this.prefs = new Prefs(); + this.changedPrefs(this.prefs); + this.prefs.addListener(this); } catch(e) { if (this.strings) { alert(this.strings.getString("initError") + "\n\n" + e); @@ -26,7 +28,7 @@ var RedirectorOverlay = { }, onUnload : function(event) { - Redirector.prefs.removeListener(this); + this.prefs.dispose(); Redirector.debug("Finished cleanup"); }, @@ -71,7 +73,7 @@ var RedirectorOverlay = { }, toggleEnabled : function(event) { - Redirector.prefs.enabled = !Redirector.prefs.enabled; + this.prefs.enabled = !this.prefs.enabled; }, openSettings : function() { diff --git a/chrome/content/code/editRedirect.xul.js b/chrome/content/code/editRedirect.xul.js index 578f498..72513e8 100644 --- a/chrome/content/code/editRedirect.xul.js +++ b/chrome/content/code/editRedirect.xul.js @@ -1,7 +1,5 @@ //// $Id$ -var Redirector = Components.classes["@einaregilsson.com/redirector;1"].getService(Components.interfaces.nsISupports).wrappedJSObject; - var EditRedirect = { txtExampleUrl : null, txtIncludePattern : null, diff --git a/chrome/content/code/prefs.js b/chrome/content/code/prefs.js index c87eb27..4118bc5 100644 --- a/chrome/content/code/prefs.js +++ b/chrome/content/code/prefs.js @@ -49,7 +49,8 @@ Prefs.prototype = { this.service.addObserver('extensions.redirector', this, false); }, - destroy : function() { + dispose : function() { + this._listeners = null; this.service.removeObserver('extensions.redirector', this); }, diff --git a/chrome/content/code/redirect.js b/chrome/content/code/redirect.js index e65ca50..2be8fc9 100644 --- a/chrome/content/code/redirect.js +++ b/chrome/content/code/redirect.js @@ -1,5 +1,7 @@ //// $Id$ +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + function Redirect(exampleUrl, includePattern, redirectUrl, patternType, excludePattern, unescapeMatches, disabled) { this._init(exampleUrl, includePattern, redirectUrl, patternType, excludePattern, unescapeMatches, disabled); } @@ -9,33 +11,145 @@ Redirect.WILDCARD = 'W'; Redirect.REGEX = 'R'; Redirect.prototype = { - - //These are the only ones that are necessary to have as properties for now - //The others can be changed to properties later as neccessary - _includePattern : null, - _excludePattern : null, - _patternType : null, - _rxInclude : null, - _rxExclude : null, - - get patternType() { return this._patternType; }, - set patternType(value) { - this._patternType = value; - this.compile(); - }, + // rdIRedirect implementation + + //attributes + exampleUrl : null, + get includePattern() { return this._includePattern; }, set includePattern(value) { this._includePattern = value; this._rxInclude = this._compile(value); }, - + get excludePattern() { return this._excludePattern; }, set excludePattern(value) { this._excludePattern = value; this._rxExclude = this._compile(value); }, + redirectTo : null, + + get patternType() { return this._patternType; }, + set patternType(value) { + this._patternType = value; + this.compile(); + }, + + unescapeMatches : false, + + disabled : false, + + //Functions + clone : function() { + return new Redirect(this.exampleUrl, this.includePattern, + this.redirectUrl, this.patternType, + this.excludePattern, this.unescapeMatches, + this.disabled); + }, + + compile : function() { + this._rxInclude = this._compile(this._includePattern); + this._rxExclude = this._compile(this._excludePattern); + }, + + copyValues : function(other) { + this.exampleUrl = other.exampleUrl; + this.includePattern = other.includePattern; + this.excludePattern = other.excludePattern; + this.redirectUrl = other.redirectUrl; + this.patternType = other.patternType; + this.unescapeMatches = other.unescapeMatches; + this.disabled = other.disabled; + }, + + deserialize : function(str) { + if (!str || !str.split) { + throw Error("Invalid serialized redirect: " + str); + } + var parts = str.split(',,,'); + if (parts.length < 5) { + throw Error("Invalid serialized redirect, too few fields: " + str); + } + this._init.apply(this, parts); + }, + + equals : function(redirect) { + return this.exampleUrl == redirect.exampleUrl + && this.includePattern == redirect.includePattern + && this.excludePattern == redirect.excludePattern + && this.redirectUrl == redirect.redirectUrl + && this.patternType == redirect.patternType + && this.unescapeMatches == redirect.unescapeMatches + ; + }, + + getMatch: function(url) { + var result = { + isMatch : false, + isExcludeMatch : false, + isDisabledMatch : false, + redirectTo : '', + toString : function() { return "{ isMatch : " + this.isMatch + + ", isExcludeMatch : " + this.isExcludeMatch + + ", isDisabledMatch : " + this.isDisabledMatch + + ", redirectTo : \"" + this.redirectTo + "\"" + + "}"; } + }; + var redirectTo = null; + + redirectTo = this._includeMatch(url); + if (redirectTo !== null) { + if (this.disabled) { + result.isDisabledMatch = true; + } else if (this._excludeMatch(url)) { + result.isExcludeMatch = true; + } else { + result.isMatch = true; + result.redirectTo = redirectTo; + } + } + return result; + }, + + isRegex: function() { + return this.patternType == Redirect.REGEX; + }, + + isWildcard : function() { + return this.patternType == Redirect.WILDCARD; + }, + + serialize : function() { + return [ this.exampleUrl + , this.includePattern + , this.redirectUrl + , this.patternType + , this.excludePattern + , this.unescapeMatches + , this.disabled ].join(',,,'); + }, + + test : function() { + return this.getMatch(this.exampleUrl); + }, + + //end rdIRedirect + + //nsISupports + QueryInterface : XPCOMUtils.generateQI([Components.interfaces.rdIRedirect]), + + //end nsISupports + + //Private functions below + + _includePattern : null, + _excludePattern : null, + _patternType : null, + _rxInclude : null, + _rxExclude : null, + _preparePattern : function(pattern) { if (this.patternType == Redirect.REGEX) { return pattern; @@ -55,12 +169,7 @@ Redirect.prototype = { return converted; } }, - - compile : function() { - this._rxInclude = this._compile(this._includePattern); - this._rxExclude = this._compile(this._excludePattern); - }, - + _compile : function(pattern) { if (!pattern) { return null; @@ -90,67 +199,6 @@ Redirect.prototype = { + '\n}\n'; }, - isWildcard : function() { - return this.patternType == Redirect.WILDCARD; - }, - - isRegex: function() { - return this.patternType == Redirect.REGEX; - }, - - test : function() { - return this.getMatch(this.exampleUrl); - }, - - serialize : function() { - return [ this.exampleUrl - , this.includePattern - , this.redirectUrl - , this.patternType - , this.excludePattern - , this.unescapeMatches - , this.disabled ].join(',,,'); - }, - - deserialize : function(str) { - if (!str || !str.split) { - throw Error("Invalid serialized redirect: " + str); - } - var parts = str.split(',,,'); - if (parts.length < 5) { - throw Error("Invalid serialized redirect, too few fields: " + str); - } - this._init.apply(this, parts); - }, - - getMatch: function(url) { - var result = { - isMatch : false, - isExcludeMatch : false, - isDisabledMatch : false, - redirectTo : '', - toString : function() { return "{ isMatch : " + this.isMatch + - ", isExcludeMatch : " + this.isExcludeMatch + - ", isDisabledMatch : " + this.isDisabledMatch + - ", redirectTo : \"" + this.redirectTo + "\"" + - "}"; } - }; - var redirectTo = null; - - redirectTo = this._includeMatch(url); - if (redirectTo !== null) { - if (this.disabled) { - result.isDisabledMatch = true; - } else if (this._excludeMatch(url)) { - result.isExcludeMatch = true; - } else { - result.isMatch = true; - result.redirectTo = redirectTo; - } - } - return result; - }, - _includeMatch : function(url) { if (!this._rxInclude) { return null; @@ -174,32 +222,5 @@ Redirect.prototype = { var shouldExclude = !!this._rxExclude.exec(url); this._rxExclude.lastIndex = 0; return shouldExclude; - }, - - clone : function() { - return new Redirect(this.exampleUrl, this.includePattern, - this.redirectUrl, this.patternType, - this.excludePattern, this.unescapeMatches, - this.disabled); - }, - - copyValues : function(other) { - this.exampleUrl = other.exampleUrl; - this.includePattern = other.includePattern; - this.excludePattern = other.excludePattern; - this.redirectUrl = other.redirectUrl; - this.patternType = other.patternType; - this.unescapeMatches = other.unescapeMatches; - this.disabled = other.disabled; - }, - - equals : function(redirect) { - return this.exampleUrl == redirect.exampleUrl - && this.includePattern == redirect.includePattern - && this.excludePattern == redirect.excludePattern - && this.redirectUrl == redirect.redirectUrl - && this.patternType == redirect.patternType - && this.unescapeMatches == redirect.unescapeMatches - ; - } + } }; \ No newline at end of file diff --git a/chrome/content/code/redirector.prototype.js b/chrome/content/code/redirector.prototype.js index 1b32ad1..23400d4 100644 --- a/chrome/content/code/redirector.prototype.js +++ b/chrome/content/code/redirector.prototype.js @@ -1,70 +1,146 @@ //// $Id$ Redirector.prototype = { + + //rdIRedirector implementation + get enabled() { + return this._prefs && this._prefs.enabled; + }, + + set enabled(value) { + if (this._prefs) { + this._prefs.enabled = value; + } + }, - prefs : null, - list : null, - strings : null, - cout : Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService), + get redirectCount() { + return this._list.length; + }, + + addRedirect : function(redirect) { + this._list.push(redirect); + this.save(); + }, - init : function() { - this.prefs = new Prefs(); - //Check if we need to update existing redirects - var data = this.prefs.redirects; - var version = this.prefs.version; - 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 = JSON.parse(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.prefs.redirects = newArr.join(':::'); - } - this.prefs.version = '2.0'; - } - //Update finished - - //Now get from the new format - data = this.prefs.redirects; - var arr; - this.list = []; - if (data != '') { - for each (redirectString in data.split(':::')) { - var redirect = new Redirect(); - redirect.deserialize(redirectString); - this.list.push(redirect); - } - } + debug : function(msg) { + if (this._prefs.debugEnabled) { + this._cout.logStringMessage('REDIRECTOR: ' + msg); + } }, - 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); - }, + deleteRedirectAt : function(index) { + this._list.splice(index, 1); + this.save(); + }, - debug : function(msg) { - if (this.prefs.debugEnabled) { - this.cout.logStringMessage('REDIRECTOR: ' + msg); + exportRedirects : function(file) { + var fileStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); + const PR_WRONLY = 0x02; + const PR_CREATE_FILE = 0x08; + const PR_TRUNCATE = 0x20; + + fileStream.init(file, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, 0644, 0); + var stream = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream); + stream.init(fileStream, "UTF-8", 16384, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); + stream.writeString(this._redirectsAsString('\n')); + stream.close(); + }, + + getRedirectAt : function(index) { + return this._list[index]; + }, + + //Get the redirect url for the given url. This will not check if we are enabled, and + //not do any verification on the url, just assume that it is a good string url that is for http/s + getRedirectUrl : function(url) { + this.debug("Checking " + url); + + for each (var redirect in this._list) { + 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'); + } else if (result.isDisabledMatch) { + this.debug(url + ' matched pattern ' + redirect.includePattern + ' but the redirect is disabled'); + } else if (result.isMatch) { + redirectUrl = this._makeAbsoluteUrl(url, result.redirectTo); + + //check for loops... + result = redirect.getMatch(redirectUrl); + if (result.isMatch) { + var title = this._getString('invalidRedirectTitle'); + var msg = this._getFormattedString('invalidRedirectText', [redirect.includePattern, url, redirectUrl]); + this.debug(msg); + redirect.disabled = true; + this.save(); + this._msgBox(title, msg); + } else { + this.debug('Redirecting ' + url + ' to ' + redirectUrl); + return redirectUrl; + } + } } + return null; + }, + + importRedirects : function(file) { + var fileStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); + fileStream.init(file, 0x01, 0444, 0); //TODO: Find the actual constants for these magic numbers + + var stream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream); + stream.init(fileStream, "UTF-8", 16384, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); + stream = stream.QueryInterface(Ci.nsIUnicharLineInputStream); + + var importCount = 0, existsCount = 0; + var lines = []; + var line = {value: null}; + stream.readLine(line); + while (line.value) { + var redirect = new Redirect(); + redirect.deserialize(line.value.replace('\n', '')); + if (this._containsRedirect(redirect)) { + existsCount++; + } else { + this._list.push(redirect); + importCount++; + } + stream.readLine(line); + } + stream.close(); + this.save(); + return importCount | (existsCount << 16); + }, + + reload : function() { + loader.loadSubScript('chrome://redirector/content/code/redirector.prototype.js'); + loader.loadSubScript('chrome://redirector/content/code/redirect.js'); + var oldEnabled = this.enabled; + for (var key in Redirector.prototype) { + if (key != 'redirectCount' && key != 'enabled') { + this[key] = Redirector.prototype[key]; + } + } + this._init(); + this.enabled = oldEnabled; + }, + + save : function() { + this._prefs.redirects = this._redirectsAsString(':::'); }, + + switchItems : function(index1, index2) { + var item = this._list[index1]; + this._list[index1] = this._list[index2]; + this._list[index2] = item; + this.save(); + }, + + //End rdIRedirector - // nsIContentPolicy interface implementation + // nsIContentPolicy implementation shouldLoad: function(contentType, contentLocation, requestOrigin, aContext, mimeTypeGuess, extra) { try { //This is also done in getRedirectUrl, but we want to exit as quickly as possible for performance - if (!this.prefs.enabled) { + if (!this._prefs.enabled) { return Ci.nsIContentPolicy.ACCEPT; } @@ -94,45 +170,12 @@ Redirector.prototype = { }, - //Get the redirect url for the given url. This will not check if we are enabled, and - //not do any verification on the url, just assume that it is a good string url that is for http/s - getRedirectUrl : function(url) { - this.debug("Checking " + url); - - for each (var redirect in this.list) { - 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'); - } else if (result.isDisabledMatch) { - this.debug(url + ' matched pattern ' + redirect.includePattern + ' but the redirect is disabled'); - } else if (result.isMatch) { - redirectUrl = this.makeAbsoluteUrl(url, result.redirectTo); - - //check for loops... - result = redirect.getMatch(redirectUrl); - if (result.isMatch) { - var title = this.getString('invalidRedirectTitle'); - var msg = this.getFormattedString('invalidRedirectText', [redirect.includePattern, url, redirectUrl]); - this.debug(msg); - redirect.disabled = true; - this.save(); - this.msgBox(title, msg); - } else { - this.debug('Redirecting ' + url + ' to ' + redirectUrl); - return redirectUrl; - } - } - } - return null; - }, - - // nsIContentPolicy interface implementation shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) { return Ci.nsIContentPolicy.ACCEPT; }, + //end nsIContentPolicy - //nsIChannelEventSink interface implementation - //Mostly borrowed from the excellent Adblock Plus extension + //nsIChannelEventSink implementation onChannelRedirect: function(oldChannel, newChannel, flags) { try { @@ -177,78 +220,72 @@ Redirector.prototype = { dump("Redirector: Unexpected error in onChannelRedirect: " + e + "\n"); } }, - - reload : function() { - loader.loadSubScript('chrome://redirector/content/code/redirector.prototype.js'); - loader.loadSubScript('chrome://redirector/content/code/redirect.js'); - - for (var key in Redirector.prototype) { - this[key] = Redirector.prototype[key]; - } - this.init(); - }, - - addRedirect : function(redirect) { - this.list.push(redirect); - this.save(); - }, + //end nsIChannelEventSink + + //Private members and methods + + _prefs : null, + _list : null, + _strings : null, + _cout : Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService), - deleteAt : function(index) { - this.list.splice(index, 1); - this.save(); - }, - - save : function() { - this.prefs.redirects = this.redirectsAsString(':::'); + _init : function() { + if (this._prefs) { + this._prefs.dispose(); + } + this._prefs = new Prefs(); + //Check if we need to update existing redirects + var data = this._prefs.redirects; + var version = this._prefs.version; + 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 = JSON.parse(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._prefs.redirects = newArr.join(':::'); + } + this._prefs.version = '2.0'; + } + //Update finished + + //Now get from the new format + data = this._prefs.redirects; + var arr; + this._list = []; + if (data != '') { + for each (redirectString in data.split(':::')) { + var redirect = new Redirect(); + redirect.deserialize(redirectString); + this._list.push(redirect); + } + } }, - redirectsAsString : function(seperator) { - return [r.serialize() for each (r in this.list)].join(seperator); + _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); + }, + + _redirectsAsString : function(seperator) { + return [r.serialize() for each (r in this._list)].join(seperator); }, - exportRedirects : function(file) { - var fileStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); - const PR_WRONLY = 0x02; - const PR_CREATE_FILE = 0x08; - const PR_TRUNCATE = 0x20; - - fileStream.init(file, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, 0644, 0); - var stream = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream); - stream.init(fileStream, "UTF-8", 16384, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); - stream.writeString(this.redirectsAsString('\n')); - stream.close(); - }, - - importRedirects : function(file) { - var fileStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); - fileStream.init(file, 0x01, 0444, 0); //TODO: Find the actual constants for these magic numbers - - var stream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream); - stream.init(fileStream, "UTF-8", 16384, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); - stream = stream.QueryInterface(Ci.nsIUnicharLineInputStream); - - var importCount = 0, existsCount = 0; - var lines = []; - var line = {value: null}; - stream.readLine(line); - while (line.value) { - var redirect = new Redirect(); - redirect.deserialize(line.value.replace('\n', '')); - if (this.containsRedirect(redirect)) { - existsCount++; - } else { - this.list.push(redirect); - importCount++; - } - stream.readLine(line); - } - stream.close(); - this.save(); - return { imported : importCount, existed : existsCount }; - }, - containsRedirect : function(redirect) { - for each (var existing in this.list) { + _containsRedirect : function(redirect) { + for each (var existing in this._list) { if (existing.equals(redirect)) { return true; } @@ -256,21 +293,21 @@ Redirector.prototype = { return false; }, - getString : function(name) { - return this.strings.GetStringFromName(name); + _getString : function(name) { + return this._strings.GetStringFromName(name); }, - getFormattedString : function(name, params) { - return this.strings.formatStringFromName(name, params, params.length); + _getFormattedString : function(name, params) { + return this._strings.formatStringFromName(name, params, params.length); }, - msgBox : function(title, text) { + _msgBox : function(title, text) { Cc["@mozilla.org/embedcomp/prompt-service;1"] .getService(Ci.nsIPromptService) .alert(null, title, text); }, - makeAbsoluteUrl : function(currentUrl, relativeUrl) { + _makeAbsoluteUrl : function(currentUrl, relativeUrl) { if (relativeUrl.match(/https?:/)) { return relativeUrl; diff --git a/chrome/content/code/settings.xul.js b/chrome/content/code/settings.xul.js index f85c1ee..8958028 100644 --- a/chrome/content/code/settings.xul.js +++ b/chrome/content/code/settings.xul.js @@ -1,6 +1,6 @@ // $Id$ -var Redirector = Components.classes["@einaregilsson.com/redirector;1"].getService(Components.interfaces.nsISupports).wrappedJSObject; +var Redirector = Components.classes["@einaregilsson.com/redirector;1"].getService(Components.interfaces.rdIRedirector); const Cc = Components.classes; const Ci = Components.interfaces; const nsLocalFile = Components.Constructor("@mozilla.org/file/local;1", "nsILocalFile", "initWithPath"); @@ -18,6 +18,7 @@ var Settings = { chkShowStatusBarIcon : null, chkShowContextMenu : null, chkEnableDebugOutput : null, + prefs : null, onLoad : function() { try { @@ -34,15 +35,20 @@ var Settings = { this.chkShowContextMenu = document.getElementById('chkShowContextMenu'); this.chkEnableDebugOutput = document.getElementById('chkEnableDebugOutput'); + this.prefs = new Prefs(); //Preferences - this.setPrefs(Redirector.prefs); - Redirector.prefs.addListener(this); + this.changedPrefs(this.prefs); + this.prefs.addListener(this); //Redirect list this.lstRedirects.selType = 'single'; this.template = document.getElementsByTagName('richlistitem')[0]; this.lstRedirects.removeChild(this.template); - this.addItemsToListBox(Redirector.list); + var list = []; + for (var i = 0; i < Redirector.redirectCount; i++) { + list.push(Redirector.getRedirectAt(i)); + } + this.addItemsToListBox(list); this.selectionChange(); this.strings = document.getElementById('redirector-strings'); @@ -56,14 +62,10 @@ var Settings = { }, onUnload : function() { - Redirector.prefs.removeListener(this); + this.prefs.dispose(); }, - changedPrefs : function(prefs) { - this.setPrefs(prefs); - }, - - setPrefs : function(prefs) { + changedPrefs : function(prefs) { this.chkEnableRedirector.setAttribute('checked', prefs.enabled); this.chkShowStatusBarIcon.setAttribute('checked', prefs.showStatusBarIcon); this.chkShowContextMenu.setAttribute('checked', prefs.showContextMenu); @@ -110,22 +112,18 @@ var Settings = { }, moveDown : function() { - if (this.lstRedirects.selectedIndex == Redirector.list.length-1) { + if (this.lstRedirects.selectedIndex == Redirector.redirectCount-1) { return; } this.switchItems(this.lstRedirects.selectedIndex); }, switchItems : function(firstIndex) { - var firstRedirect = Redirector.list[firstIndex]; - var secondRedirect = Redirector.list[firstIndex+1]; - Redirector.list[firstIndex] = secondRedirect; - Redirector.list[firstIndex+1] = firstRedirect; + Redirector.switchItems(firstIndex, firstIndex+1); var firstItem = this.lstRedirects.children[firstIndex]; var secondItem = this.lstRedirects.children[firstIndex+1]; this.lstRedirects.removeChild(secondItem); this.lstRedirects.insertBefore(secondItem, firstItem); - Redirector.save(); this.selectionChange(); }, @@ -136,7 +134,7 @@ var Settings = { }, preferenceChange : function(event) { - Redirector.prefs[event.originalTarget.getAttribute('preference')] = event.originalTarget.hasAttribute('checked'); + this.prefs[event.originalTarget.getAttribute('preference')] = event.originalTarget.hasAttribute('checked'); }, addRedirect : function() { @@ -187,7 +185,7 @@ var Settings = { try { this.lstRedirects.removeChild(this.lstRedirects.children[index]); - Redirector.deleteAt(index); + Redirector.deleteRedirectAt(index); this.selectionChange(); } catch(e) { alert(e); @@ -211,54 +209,55 @@ var Settings = { this.btnEdit.disabled = (index == -1); this.btnDelete.disabled = (index == -1); this.btnUp.disabled = (index <= 0); - this.btnDown.disabled = (index == -1 || index >= Redirector.list.length-1); - this.btnExport.disabled = (Redirector.list.length == 0); + this.btnDown.disabled = (index == -1 || index >= Redirector.redirectCount-1); + this.btnExport.disabled = (Redirector.redirectCount== 0); }, - - importExport : function(mode, captionKey, func) { + + getFile : function(captionKey, mode) { //Mostly borrowed from Adblock Plus var picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); - picker.init(window, Redirector.getString(captionKey), mode); + picker.init(window, this.strings.getString(captionKey), mode); picker.defaultExtension = ".rdx"; - var dir = Redirector.prefs.defaultDir; + var dir = this.prefs.defaultDir; if (dir) { picker.displayDirectory = new nsLocalFile(dir); } - picker.appendFilter(Redirector.getString('redirectorFiles'), '*.rdx'); + picker.appendFilter(this.strings.getString('redirectorFiles'), '*.rdx'); if (picker.show() == picker.returnCancel) { - return; - } - try { - Redirector.prefs.defaultDir = picker.displayDirectory.path; - return func(picker.file); - } catch (e) { - alert(e); + return null; } + this.prefs.defaultDir = picker.displayDirectory.path; + return picker.file; }, export : function() { - this.importExport(Ci.nsIFilePicker.modeSave, 'exportCaption', function(file) { + var file = this.getFile('exportCaption', Ci.nsIFilePicker.modeSave); + if (file) { Redirector.exportRedirects(file); - }); + } }, import : function() { - var result = this.importExport(Ci.nsIFilePicker.modeOpen, 'importCaption', function(file) { - return Redirector.importRedirects(file); - }); - - var msg + var file = this.getFile('importCaption', Ci.nsIFilePicker.modeOpen); + var result; + if (file) { + result = Redirector.importRedirects(file); + } + + var msg, imported, existed; + imported = result & 0xFFFF; + existed = result >> 16; - if (result.imported > 0) { - msg = this.strings.getPluralized('importedMessage', result.imported); - if (result.existed > 0) { - msg += ', ' + this.strings.getPluralized('existedMessage',result.existed); + if (imported > 0) { + msg = this.strings.getPluralized('importedMessage', imported); + if (existed > 0) { + msg += ', ' + this.strings.getPluralized('existedMessage',existed); } else { msg += '.'; } - } else if (result.imported == 0 && result.existed > 0) { - msg = this.strings.getPluralized('allExistedMessage', result.existed); + } else if (imported == 0 && existed > 0) { + msg = this.strings.getPluralized('allExistedMessage', existed); } else { //Both 0 msg = this.strings.getString('importedNone'); } @@ -266,10 +265,10 @@ var Settings = { var title = this.strings.getString("importResult"); Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService).alert(null, title, msg); - if (result.imported > 0) { + if (imported > 0) { var newlist = []; - for (var i = Redirector.list.length-result.imported; i < Redirector.list.length; i++) { - newlist.push(Redirector.list[i]); + for (var i = Redirector.redirectCount-result.imported; i < Redirector.redirectCount; i++) { + newlist.push(Redirector.getRedirectAt(i)); } this.addItemsToListBox(newlist); } diff --git a/chrome/content/ui/browserOverlay.xul b/chrome/content/ui/browserOverlay.xul index 7b40c65..d67928c 100644 --- a/chrome/content/ui/browserOverlay.xul +++ b/chrome/content/ui/browserOverlay.xul @@ -4,6 +4,7 @@