| Index: lib/main.js | 
| =================================================================== | 
| --- a/lib/main.js | 
| +++ b/lib/main.js | 
| @@ -0,0 +1,98 @@ | 
| +/* | 
| + * This file is part of Adblock Plus <http://adblockplus.org/>, | 
| + * Copyright (C) 2006-2014 Eyeo GmbH | 
| + * | 
| + * Adblock Plus is free software: you can redistribute it and/or modify | 
| + * it under the terms of the GNU General Public License version 3 as | 
| + * published by the Free Software Foundation. | 
| + * | 
| + * Adblock Plus is distributed in the hope that it will be useful, | 
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| + * GNU General Public License for more details. | 
| + * | 
| + * You should have received a copy of the GNU General Public License | 
| + * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| + */ | 
| + | 
| +let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", null); | 
| +let {Services} = Cu.import("resource://gre/modules/Services.jsm", null); | 
| + | 
| +let optionsObserver = | 
| +{ | 
| +  init: function() | 
| +  { | 
| +    Services.obs.addObserver(this, "addon-options-displayed", true); | 
| +    onShutdown.add(function() | 
| +    { | 
| +      Services.obs.removeObserver(this, "addon-options-displayed"); | 
| +    }.bind(this)); | 
| +  }, | 
| + | 
| +  observe: function(subject, topic, data) | 
| +  { | 
| +    let {addonID} = require("info") | 
| +    if (data != addonID) | 
| +      return; | 
| + | 
| +    let doc = subject.QueryInterface(Ci.nsIDOMDocument); | 
| + | 
| +    let testList = doc.getElementById("adblockplustests-tests"); | 
| +    for (let test of getTests()) | 
| +      testList.appendItem(test, test); | 
| + | 
| +    doc.getElementById("adblockplustests-run").addEventListener("command", doRun, false); | 
| +  }, | 
| + | 
| +  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]) | 
| +}; | 
| +optionsObserver.init(); | 
| + | 
| +function doRun(event) | 
| +{ | 
| +  let wnd = Services.wm.getMostRecentWindow("adblockplustests:harness"); | 
| +  if (wnd) | 
| +  { | 
| +    wnd.focus(); | 
| +    return; | 
| +  } | 
| + | 
| +  let doc = event.target.ownerDocument; | 
| + | 
| +  let params = ""; | 
| +  let testList = doc.getElementById("adblockplustests-tests"); | 
| +  if (testList.value) | 
| +    params = "?test=" + encodeURIComponent(testList.value); | 
| + | 
| +  doc.defaultView.openDialog("chrome://adblockplustests/content/harness.xul" + params, "_blank", "chrome,centerscreen,resizable,dialog=no"); | 
| +} | 
| + | 
| +function getTests() | 
| +{ | 
| +  let result = []; | 
| + | 
| +  let {addonRoot} = require("info"); | 
| +  let uri = Services.io.newURI(addonRoot, null, null).QueryInterface(Components.interfaces.nsIJARURI); | 
| +  let zipReader = Cc["@mozilla.org/libjar/zip-reader;1"].createInstance(Ci.nsIZipReader); | 
| +  zipReader.open(uri.JARFile.QueryInterface(Ci.nsIFileURL).file); | 
| + | 
| +  try | 
| +  { | 
| +    let enumerator = zipReader.findEntries(null); | 
| +    let prefix = "chrome/content/tests/"; | 
| +    let suffix = ".js"; | 
| +    while (enumerator.hasMore()) | 
| +    { | 
| +      let name = enumerator.getNext(); | 
| +      if (name.indexOf(prefix) == 0 && name.lastIndexOf(suffix) == name.length - suffix.length) | 
| +        result.push(name.substring(prefix.length, name.length - suffix.length)); | 
| +    } | 
| +  } | 
| +  finally | 
| +  { | 
| +    zipReader.close(); | 
| +  } | 
| +  result.sort(); | 
| +  return result; | 
| +}; | 
| +exports.getTests = getTests; | 
|  |