| Index: chrome/content/tests/notification.js | 
| =================================================================== | 
| deleted file mode 100644 | 
| --- a/chrome/content/tests/notification.js | 
| +++ /dev/null | 
| @@ -1,486 +0,0 @@ | 
| -(function() | 
| -{ | 
| -  let testRunner = null; | 
| -  let randomResult = 0.5; | 
| - | 
| -  let originalInfo; | 
| -  let info = require("info"); | 
| - | 
| -  function showNotifications(url) | 
| -  { | 
| -    let shownNotifications = []; | 
| -    function showListener(notification) | 
| -    { | 
| -      shownNotifications.push(notification); | 
| -      Notification.markAsShown(notification.id); | 
| -    } | 
| -    Notification.addShowListener(showListener); | 
| -    Notification.showNext(url); | 
| -    Notification.removeShowListener(showListener); | 
| -    return shownNotifications; | 
| -  } | 
| - | 
| -  module("Notification handling", | 
| -  { | 
| -    setup: function() | 
| -    { | 
| -      testRunner = this; | 
| - | 
| -      preparePrefs.call(this); | 
| -      setupVirtualTime.call(this, function(wrapTimer) | 
| -      { | 
| -        let NotificationModule = getModuleGlobal("notification"); | 
| -        NotificationModule.downloader._timer = wrapTimer(NotificationModule.downloader._timer); | 
| -      }, "notification", "downloader"); | 
| -      setupVirtualXMLHttp.call(this, "notification", "downloader"); | 
| - | 
| -      originalInfo = {}; | 
| -      for (let key in info) | 
| -        originalInfo[key] = info[key]; | 
| - | 
| -      info.addonName = "adblockpluschrome"; | 
| -      info.addonVersion = "1.4.1"; | 
| -      info.application = "chrome"; | 
| -      info.applicationVersion = "27.0"; | 
| -      info.platform = "chromium"; | 
| -      info.platformVersion = "12.0"; | 
| - | 
| -      Prefs.notificationurl = "http://example.com/notification.json"; | 
| -      Prefs.notificationdata = {}; | 
| -      Prefs.notifications_ignoredcategories = []; | 
| - | 
| -      // Replace Math.random() function | 
| -      let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader")); | 
| -      this._origRandom = DownloaderGlobal.Math.random; | 
| -      DownloaderGlobal.Math.random = () => randomResult; | 
| -      randomResult = 0.5; | 
| - | 
| -      let NotificationGlobal = getModuleGlobal("notification"); | 
| -      this._origShowListeners = NotificationGlobal.showListeners; | 
| -      NotificationGlobal.showListeners = []; | 
| -    }, | 
| - | 
| -    teardown: function() | 
| -    { | 
| -      restorePrefs.call(this); | 
| -      restoreVirtualTime.call(this); | 
| -      restoreVirtualXMLHttp.call(this); | 
| - | 
| -      for (let key in originalInfo) | 
| -        info[key] = originalInfo[key]; | 
| - | 
| -      if (this._origRandom) | 
| -      { | 
| -        let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader")); | 
| -        DownloaderGlobal.Math.random = this._origRandom; | 
| -        delete this._origRandom; | 
| -      } | 
| - | 
| -      if (this._origShowListeners) | 
| -      { | 
| -        let NotificationGlobal = getModuleGlobal("notification"); | 
| -        NotificationGlobal.showListeners = this._origShowListeners; | 
| -        delete this._origShowListeners; | 
| -      } | 
| - | 
| -      Notification.init(); | 
| -    } | 
| -  }); | 
| - | 
| -  function registerHandler(notifications, checkCallback) | 
| -  { | 
| -    testRunner.registerHandler("/notification.json", function(metadata) | 
| -    { | 
| -      if (checkCallback) | 
| -        checkCallback(metadata); | 
| - | 
| -      let notification = { | 
| -        version: 55, | 
| -        notifications: notifications | 
| -      }; | 
| - | 
| -      return [Cr.NS_OK, 200, JSON.stringify(notification)]; | 
| -    }); | 
| -  } | 
| - | 
| -  function fixConstructors(object) | 
| -  { | 
| -    // deepEqual() expects that the constructors used in expected objects and | 
| -    // the ones in the actual results are the same. That means that we actually | 
| -    // have to construct our objects in the context of the notification module. | 
| -    let JSON = Cu.getGlobalForObject(Notification).JSON; | 
| -    return JSON.parse(JSON.stringify(object)); | 
| -  } | 
| - | 
| -  test("No data", function() | 
| -  { | 
| -    deepEqual(showNotifications(), [], "No notifications should be returned if there is no data"); | 
| -  }); | 
| - | 
| -  test("Single notification", function() | 
| -  { | 
| -    let information = fixConstructors({ | 
| -      id: 1, | 
| -      type: "information", | 
| -      message: {"en-US": "Information"} | 
| -    }); | 
| - | 
| -    registerHandler([information]); | 
| -    testRunner.runScheduledTasks(1); | 
| - | 
| -    deepEqual(showNotifications(), [information], "The notification is shown"); | 
| -    deepEqual(showNotifications(), [], "Informational notifications aren't shown more than once"); | 
| -  }); | 
| - | 
| -  test("Information and critical", function() | 
| -  { | 
| -    let information = fixConstructors({ | 
| -      id: 1, | 
| -      type: "information", | 
| -      message: {"en-US": "Information"} | 
| -    }); | 
| -    let critical = fixConstructors({ | 
| -      id: 2, | 
| -      type: "critical", | 
| -      message: {"en-US": "Critical"} | 
| -    }); | 
| - | 
| -    registerHandler([information, critical]); | 
| -    testRunner.runScheduledTasks(1); | 
| - | 
| -    deepEqual(showNotifications(), [critical], "The critical notification is given priority"); | 
| -    deepEqual(showNotifications(), [critical], "Critical notifications can be shown multiple times"); | 
| -  }); | 
| - | 
| -  test("No type", function() | 
| -  { | 
| -    let information = fixConstructors({ | 
| -      id: 1, | 
| -      message: {"en-US": "Information"} | 
| -    }); | 
| - | 
| -    registerHandler([information]); | 
| -    testRunner.runScheduledTasks(1); | 
| - | 
| -    deepEqual(showNotifications(), [information], "The notification is shown"); | 
| -    deepEqual(showNotifications(), [], "Notification is treated as type information"); | 
| -  }); | 
| - | 
| -  test("Target selection", function() | 
| -  { | 
| -    let targets = [ | 
| -      ["extension", "adblockpluschrome", true], | 
| -      ["extension", "adblockplus", false], | 
| -      ["extension", "adblockpluschrome2", false], | 
| -      ["extensionMinVersion", "1.4", true], | 
| -      ["extensionMinVersion", "1.4.1", true], | 
| -      ["extensionMinVersion", "1.5", false], | 
| -      ["extensionMaxVersion", "1.5", true], | 
| -      ["extensionMaxVersion", "1.4.1", true], | 
| -      ["extensionMaxVersion", "1.4.*", true], | 
| -      ["extensionMaxVersion", "1.4", false], | 
| -      ["application", "chrome", true], | 
| -      ["application", "firefox", false], | 
| -      ["applicationMinVersion", "27.0", true], | 
| -      ["applicationMinVersion", "27", true], | 
| -      ["applicationMinVersion", "26", true], | 
| -      ["applicationMinVersion", "28", false], | 
| -      ["applicationMinVersion", "27.1", false], | 
| -      ["applicationMaxVersion", "27.0", true], | 
| -      ["applicationMaxVersion", "27", true], | 
| -      ["applicationMaxVersion", "28", true], | 
| -      ["applicationMaxVersion", "26", false], | 
| -      ["platform", "chromium", true], | 
| -      ["platform", "gecko", false], | 
| -      ["platformMinVersion", "12.0", true], | 
| -      ["platformMinVersion", "12", true], | 
| -      ["platformMinVersion", "11", true], | 
| -      ["platformMinVersion", "13", false], | 
| -      ["platformMinVersion", "12.1", false], | 
| -      ["platformMaxVersion", "12.0", true], | 
| -      ["platformMaxVersion", "12", true], | 
| -      ["platformMaxVersion", "13", true], | 
| -      ["platformMaxVersion", "11", false], | 
| -    ]; | 
| - | 
| -    for (let [propName, value, result] of targets) | 
| -    { | 
| -      let targetInfo = {}; | 
| -      targetInfo[propName] = value; | 
| - | 
| -      let information = fixConstructors({ | 
| -        id: 1, | 
| -        type: "information", | 
| -        message: {"en-US": "Information"}, | 
| -        targets: [targetInfo] | 
| -      }); | 
| - | 
| -      Prefs.notificationdata = {}; | 
| -      registerHandler([information]); | 
| -      testRunner.runScheduledTasks(1); | 
| - | 
| -      let expected = (result ? [information] : []); | 
| -      deepEqual(showNotifications(), expected, "Selected notification for " + JSON.stringify(information.targets)); | 
| -      deepEqual(showNotifications(), [], "No notification on second call"); | 
| -    } | 
| -  }); | 
| - | 
| -  test("Multiple targets", function() | 
| -  { | 
| -    let targets = [ | 
| -      ["extension", "adblockpluschrome", true], | 
| -      ["extension", "adblockplus", false], | 
| -      ["extensionMinVersion", "1.4", true], | 
| -      ["extensionMinVersion", "1.5", false], | 
| -      ["application", "chrome", true], | 
| -      ["application", "firefox", false], | 
| -      ["applicationMinVersion", "27", true], | 
| -      ["applicationMinVersion", "28", false], | 
| -      ["platform", "chromium", true], | 
| -      ["platform", "gecko", false], | 
| -      ["platformMinVersion", "12", true], | 
| -      ["platformMinVersion", "13", false], | 
| -    ]; | 
| - | 
| -    function pairs(array) | 
| -    { | 
| -      for (let element1 of array) | 
| -        for (let element2 of array) | 
| -          if (element1 != element2) | 
| -            yield [element1, element2]; | 
| -    } | 
| - | 
| -    for (let [[propName1, value1, result1], [propName2, value2, result2]] in pairs(targets)) | 
| -    { | 
| -      let targetInfo1 = {}; | 
| -      targetInfo1[propName1] = value1; | 
| -      let targetInfo2 = {}; | 
| -      targetInfo2[propName2] = value2; | 
| - | 
| -      let information = fixConstructors({ | 
| -        id: 1, | 
| -        type: "information", | 
| -        message: {"en-US": "Information"}, | 
| -        targets: [targetInfo1, targetInfo2] | 
| -      }); | 
| - | 
| -      Prefs.notificationdata = {}; | 
| -      registerHandler([information]); | 
| -      testRunner.runScheduledTasks(1); | 
| - | 
| -      let expected = (result1 || result2 ? [information] : []) | 
| -      deepEqual(showNotifications(), expected, "Selected notification for " + JSON.stringify(information.targets)); | 
| -    } | 
| -  }); | 
| - | 
| -  test("Parameters sent", function() | 
| -  { | 
| -    Prefs.notificationdata = { | 
| -      data: { | 
| -        version: "3" | 
| -      }, | 
| -    }; | 
| - | 
| -    let parameters = null; | 
| -    registerHandler([], function(metadata) | 
| -    { | 
| -      parameters = decodeURI(metadata.queryString); | 
| -    }); | 
| -    testRunner.runScheduledTasks(1); | 
| - | 
| -    equal(parameters, | 
| -          "addonName=adblockpluschrome&addonVersion=1.4.1&application=chrome&applicationVersion=27.0&platform=chromium&platformVersion=12.0&lastVersion=3&downloadCount=0", | 
| -          "The correct parameters are sent to the server"); | 
| -  }); | 
| - | 
| -  test("Expiration interval", function() | 
| -  { | 
| -    let initialDelay = 1 / 60; | 
| -    let tests = [ | 
| -      { | 
| -        randomResult: 0.5, | 
| -        requests: [initialDelay, initialDelay + 24, initialDelay + 48] | 
| -      }, | 
| -      { | 
| -        randomResult: 0,        // Changes interval by factor 0.8 (19.2 hours) | 
| -        requests: [initialDelay, initialDelay + 20, initialDelay + 40] | 
| -      }, | 
| -      { | 
| -        randomResult: 1,        // Changes interval by factor 1.2 (28.8 hours) | 
| -        requests: [initialDelay, initialDelay + 29, initialDelay + 58] | 
| -      }, | 
| -      { | 
| -        randomResult: 0.25,     // Changes interval by factor 0.9 (21.6 hours) | 
| -        requests: [initialDelay, initialDelay + 22, initialDelay + 44] | 
| -      }, | 
| -      { | 
| -        randomResult: 0.5, | 
| -        skipAfter: initialDelay + 5, | 
| -        skip: 10,               // Short break should not increase soft expiration | 
| -        requests: [initialDelay, initialDelay + 24] | 
| -      }, | 
| -      { | 
| -        randomResult: 0.5, | 
| -        skipAfter: initialDelay + 5, | 
| -        skip: 30,               // Long break should increase soft expiration, hitting hard expiration | 
| -        requests: [initialDelay, initialDelay + 48] | 
| -      } | 
| -    ]; | 
| - | 
| -    let requests = []; | 
| -    registerHandler([], (metadata) => requests.push(testRunner.getTimeOffset())); | 
| -    for (let test of tests) | 
| -    { | 
| -      Prefs.notificationdata = {}; | 
| -      requests = []; | 
| -      randomResult = test.randomResult; | 
| - | 
| -      let maxHours = Math.round(Math.max.apply(null, test.requests)) + 1; | 
| -      testRunner.runScheduledTasks(maxHours, test.skipAfter, test.skip); | 
| - | 
| -      let skipAddendum = (typeof test.skip != "number" ? "" : " skipping " + test.skip + " hours after " + test.skipAfter + " hours"); | 
| -      deepEqual(requests, test.requests, "Requests with Math.random() returning " + randomResult + skipAddendum); | 
| -    } | 
| -  }); | 
| - | 
| -  test("Uses severity instead of type", 3, function() | 
| -  { | 
| -    let severityNotification = { | 
| -      id: 1, | 
| -      severity: "information", | 
| -      message: {"en-US": "Information"} | 
| -    }; | 
| - | 
| -    function listener(name) | 
| -    { | 
| -      if (name !== "notificationdata") | 
| -        return; | 
| - | 
| -      Prefs.removeListener(listener); | 
| -      let notification = Prefs.notificationdata.data.notifications[0]; | 
| -      ok(!("severity" in notification), "Severity property was removed"); | 
| -      ok("type" in notification, "Type property was added"); | 
| -      equal(notification.type, severityNotification.severity, "Type property has correct value"); | 
| -    } | 
| -    Prefs.addListener(listener); | 
| - | 
| -    let responseText = JSON.stringify({ | 
| -      notifications: [severityNotification] | 
| -    }); | 
| -    Notification._onDownloadSuccess({}, responseText, function() {}, function() {}); | 
| -  }); | 
| - | 
| -  test("URL-specific notification", function() | 
| -  { | 
| -    let withURLFilterFoo = fixConstructors({ | 
| -      id: 1, | 
| -      urlFilters: ["foo.com$document"] | 
| -    }); | 
| -    let withoutURLFilter = fixConstructors({ | 
| -      id: 2 | 
| -    }); | 
| -    let withURLFilterBar = fixConstructors({ | 
| -      id: 3, | 
| -      urlFilters: ["bar.com$document"] | 
| -    }); | 
| -    let subdomainURLFilter = fixConstructors({ | 
| -      id: 4, | 
| -      urlFilters: ["||example.com$document"] | 
| -    }); | 
| - | 
| -    registerHandler([ | 
| -      withURLFilterFoo, | 
| -      withoutURLFilter, | 
| -      withURLFilterBar, | 
| -      subdomainURLFilter | 
| -    ]); | 
| -    testRunner.runScheduledTasks(1); | 
| - | 
| -    deepEqual(showNotifications(), [withoutURLFilter], "URL-specific notifications are skipped"); | 
| -    deepEqual(showNotifications("http://foo.com"), [withURLFilterFoo], "URL-specific notification is retrieved"); | 
| -    deepEqual(showNotifications("http://foo.com"), [], "URL-specific notification is not retrieved"); | 
| -    deepEqual(showNotifications("http://www.example.com"), [subdomainURLFilter], "URL-specific notification matches subdomain"); | 
| -  }); | 
| - | 
| -  test("Global opt-out", function() | 
| -  { | 
| -    Notification.toggleIgnoreCategory("*", true); | 
| -    ok(Prefs.notifications_ignoredcategories.indexOf("*") != -1, "Force enable global opt-out"); | 
| -    Notification.toggleIgnoreCategory("*", true); | 
| -    ok(Prefs.notifications_ignoredcategories.indexOf("*") != -1, "Force enable global opt-out (again)"); | 
| -    Notification.toggleIgnoreCategory("*", false); | 
| -    ok(Prefs.notifications_ignoredcategories.indexOf("*") == -1, "Force disable global opt-out"); | 
| -    Notification.toggleIgnoreCategory("*", false); | 
| -    ok(Prefs.notifications_ignoredcategories.indexOf("*") == -1, "Force disable global opt-out (again)"); | 
| -    Notification.toggleIgnoreCategory("*"); | 
| -    ok(Prefs.notifications_ignoredcategories.indexOf("*") != -1, "Toggle enable global opt-out"); | 
| -    Notification.toggleIgnoreCategory("*"); | 
| -    ok(Prefs.notifications_ignoredcategories.indexOf("*") == -1, "Toggle disable global opt-out"); | 
| - | 
| -    Prefs.notifications_showui = false; | 
| -    Notification.toggleIgnoreCategory("*", false); | 
| -    ok(!Prefs.notifications_showui, "Opt-out UI will not be shown if global opt-out hasn't been enabled yet"); | 
| -    Notification.toggleIgnoreCategory("*", true); | 
| -    ok(Prefs.notifications_showui, "Opt-out UI will be shown after enabling global opt-out"); | 
| -    Notification.toggleIgnoreCategory("*", false); | 
| -    ok(Prefs.notifications_showui, "Opt-out UI will be shown after enabling global opt-out even if it got disabled again"); | 
| - | 
| -    let information = fixConstructors({ | 
| -      id: 1, | 
| -      type: "information" | 
| -    }); | 
| -    let critical = fixConstructors({ | 
| -      id: 2, | 
| -      type: "critical" | 
| -    }); | 
| - | 
| -    Notification.toggleIgnoreCategory("*", true); | 
| -    registerHandler([information]); | 
| -    testRunner.runScheduledTasks(1); | 
| - | 
| -    deepEqual(showNotifications(), [], "Information notifications are ignored after enabling global opt-out"); | 
| -    Notification.toggleIgnoreCategory("*", false); | 
| -    deepEqual(showNotifications(), [information], "Information notifications are shown after disabling global opt-out"); | 
| - | 
| -    Notification.toggleIgnoreCategory("*", true); | 
| -    Prefs.notificationdata = {}; | 
| -    registerHandler([critical]); | 
| -    testRunner.runScheduledTasks(1); | 
| - | 
| -    deepEqual(showNotifications(), [critical], "Critical notifications are not ignored"); | 
| -  }); | 
| - | 
| -  module("Notification localization"); | 
| - | 
| -  test("Message without localization", function() | 
| -  { | 
| -    let notification = {message: "non-localized"}; | 
| -    let texts = Notification.getLocalizedTexts(notification, "en-US"); | 
| -    equal(texts.message, "non-localized"); | 
| -  }); | 
| - | 
| -  test("Language only", function() | 
| -  { | 
| -    let notification = {message: {fr: "fr"}}; | 
| -    let texts = Notification.getLocalizedTexts(notification, "fr"); | 
| -    equal(texts.message, "fr"); | 
| -    texts = Notification.getLocalizedTexts(notification, "fr-CA"); | 
| -    equal(texts.message, "fr"); | 
| -  }); | 
| - | 
| -  test("Language and country", function() | 
| -  { | 
| -    let notification = {message: {fr: "fr", "fr-CA": "fr-CA"}}; | 
| -    let texts = Notification.getLocalizedTexts(notification, "fr-CA"); | 
| -    equal(texts.message, "fr-CA"); | 
| -    texts = Notification.getLocalizedTexts(notification, "fr"); | 
| -    equal(texts.message, "fr"); | 
| -  }); | 
| - | 
| -  test("Missing translation", function() | 
| -  { | 
| -    let notification = {message: {"en-US": "en-US"}}; | 
| -    let texts = Notification.getLocalizedTexts(notification, "fr"); | 
| -    equal(texts.message, "en-US"); | 
| -  }); | 
| -})(); | 
|  |