Bug 891324 - Make nsIXULRuntime accessible using Services.appinfo in xpcshell tests. r=gavin
authorPaolo Amadini <paolo.mozmail@amadzone.org>
Sat, 20 Jul 2013 15:15:03 +0200
changeset 151656 db5e3bb3205d3cbf08ecae9dbac5daad8f506677
parent 151655 9497f8c1a115b35c444e9f00784adae5cd15df2a
child 151657 6a65da0faed08ac3830760004e291c44b4b2e31c
push id2859
push userakeybl@mozilla.com
push dateMon, 16 Sep 2013 19:14:59 +0000
treeherdermozilla-beta@87d3c51cd2bf [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgavin
bugs891324
milestone25.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 891324 - Make nsIXULRuntime accessible using Services.appinfo in xpcshell tests. r=gavin
toolkit/components/jsdownloads/test/unit/test_DownloadIntegration.js
toolkit/modules/Services.jsm
toolkit/modules/tests/browser/Makefile.in
toolkit/modules/tests/browser/browser_Services.js
toolkit/modules/tests/xpcshell/test_Services.js
toolkit/modules/tests/xpcshell/xpcshell.ini
--- a/toolkit/components/jsdownloads/test/unit/test_DownloadIntegration.js
+++ b/toolkit/components/jsdownloads/test/unit/test_DownloadIntegration.js
@@ -29,20 +29,20 @@ add_task(function test_getSystemDownload
     DownloadIntegration.testMode = false;
   }
   do_register_cleanup(cleanup);
 
   let tempDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
   let downloadDir;
 
   // OSX / Linux / Windows but not XP/2k
-  if (("nsILocalFileMac" in Ci) ||
-      ("@mozilla.org/gnome-gconf-service;1" in Cc) ||
-      ("@mozilla.org/windows-registry-key;1" in Cc &&
-        parseFloat(Services.sysinfo.getProperty("version")) >= 6)) {
+  if (Services.appinfo.OS == "Darwin" ||
+      Services.appinfo.OS == "Linux" ||
+      (Services.appinfo.OS == "WINNT" &&
+       parseFloat(Services.sysinfo.getProperty("version")) >= 6)) {
     downloadDir = yield DownloadIntegration.getSystemDownloadsDirectory();
     do_check_true(downloadDir instanceof Ci.nsIFile);
     do_check_eq(downloadDir.path, tempDir.path);
     do_check_true(yield OS.File.exists(downloadDir.path));
 
     let info = yield OS.File.stat(downloadDir.path);
     do_check_true(info.isDir);
   } else {
--- a/toolkit/modules/Services.jsm
+++ b/toolkit/modules/Services.jsm
@@ -1,31 +1,38 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 this.EXPORTED_SYMBOLS = ["Services"];
 
 const Ci = Components.interfaces;
 const Cc = Components.classes;
+const Cr = Components.results;
 
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 this.Services = {};
 
 XPCOMUtils.defineLazyGetter(Services, "prefs", function () {
   return Cc["@mozilla.org/preferences-service;1"]
            .getService(Ci.nsIPrefService)
            .QueryInterface(Ci.nsIPrefBranch);
 });
 
 XPCOMUtils.defineLazyGetter(Services, "appinfo", function () {
-  return Cc["@mozilla.org/xre/app-info;1"]
-           .getService(Ci.nsIXULAppInfo)
-           .QueryInterface(Ci.nsIXULRuntime);
+  let appinfo = Cc["@mozilla.org/xre/app-info;1"]
+                  .getService(Ci.nsIXULRuntime);
+  try {
+    appinfo.QueryInterface(Ci.nsIXULAppInfo);
+  } catch (ex if ex instanceof Components.Exception &&
+                 ex.result == Cr.NS_NOINTERFACE) {
+    // Not all applications implement nsIXULAppInfo (e.g. xpcshell doesn't).
+  }
+  return appinfo;
 });
 
 XPCOMUtils.defineLazyGetter(Services, "dirsvc", function () {
   return Cc["@mozilla.org/file/directory_service;1"]
            .getService(Ci.nsIDirectoryService)
            .QueryInterface(Ci.nsIProperties);
 });
 
--- a/toolkit/modules/tests/browser/Makefile.in
+++ b/toolkit/modules/tests/browser/Makefile.in
@@ -11,14 +11,13 @@ relativesrcdir = @relativesrcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MOCHITEST_BROWSER_FILES = \
   browser_DeferredTask.js \
   browser_Deprecated.js \
   browser_Geometry.js \
   browser_InlineSpellChecker.js \
-  browser_Services.js \
   browser_Troubleshoot.js \
   
   $(NULL)
 
 include $(topsrcdir)/config/rules.mk
deleted file mode 100644
--- a/toolkit/modules/tests/browser/browser_Services.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-function test() {
-  /** Tests for Services.jsm (Bug 512784) **/
-  ok(Services, "Services object exists");
-  checkServices();
-}
-
-function checkService(service, interface) {
-  ok(service in Services, "Services." + service + " exists");
-  ok(Services[service] instanceof interface, "Services." + service + " is an " + interface);
-}
-
-function checkServices() {
-  checkService("prefs", Ci.nsIPrefBranch);
-  checkService("prefs", Ci.nsIPrefService);
-  checkService("contentPrefs", Ci.nsIContentPrefService);
-  checkService("wm", Ci.nsIWindowMediator);
-  checkService("obs", Ci.nsIObserverService);
-  checkService("perms", Ci.nsIPermissionManager);
-  checkService("io", Ci.nsIIOService);
-  checkService("io", Ci.nsIIOService2);
-  checkService("appinfo", Ci.nsIXULAppInfo);
-  checkService("appinfo", Ci.nsIXULRuntime);
-  checkService("dirsvc", Ci.nsIDirectoryService);
-  checkService("dirsvc", Ci.nsIProperties);
-  checkService("prompt", Ci.nsIPromptService);
-  if ("nsIBrowserSearchService" in Ci)
-    checkService("search", Ci.nsIBrowserSearchService);
-  checkService("storage", Ci.mozIStorageService);
-  checkService("vc", Ci.nsIVersionComparator);
-  checkService("locale", Ci.nsILocaleService);
-  checkService("scriptloader", Ci.mozIJSSubScriptLoader);
-  checkService("ww", Ci.nsIWindowWatcher);
-  checkService("tm", Ci.nsIThreadManager);
-  checkService("droppedLinkHandler", Ci.nsIDroppedLinkHandler);
-  checkService("strings", Ci.nsIStringBundleService);
-  checkService("urlFormatter", Ci.nsIURLFormatter);
-  checkService("eTLD", Ci.nsIEffectiveTLDService);
-  checkService("cookies", Ci.nsICookieManager2);
-  checkService("logins", Ci.nsILoginManager);
-  checkService("telemetry", Ci.nsITelemetry);
-  checkService("sysinfo", Ci.nsIPropertyBag2);
-  checkService("clipboard", Ci.nsIClipboard);
-  checkService("console", Ci.nsIConsoleService);
-  checkService("startup", Ci.nsIAppStartup);
-  checkService("appShell", Ci.nsIAppShellService);
-  checkService("cache", Ci.nsICacheService);
-  checkService("scriptSecurityManager", Ci.nsIScriptSecurityManager);
-  checkService("domStorageManager", Ci.nsIDOMStorageManager);
-  checkService("DOMRequest", Ci.nsIDOMRequestService);
-  checkService("downloads", Ci.nsIDownloadManager);
-  checkService("focus", Ci.nsIFocusManager);
-  checkService("uriFixup", Ci.nsIURIFixup);
-  checkService("blocklist", Ci.nsIBlocklistService);
-}
new file mode 100644
--- /dev/null
+++ b/toolkit/modules/tests/xpcshell/test_Services.js
@@ -0,0 +1,106 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * This file tests the Services.jsm module.
+ */
+
+////////////////////////////////////////////////////////////////////////////////
+/// Globals
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+const Cr = Components.results;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+function checkService(service, interface) {
+  do_print("Checking that Services." + service + " is an " + interface);
+  do_check_true(service in Services);
+  do_check_true(Services[service] instanceof interface);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Tests
+
+function run_test()
+{
+  do_get_profile();
+
+  checkService("appShell", Ci.nsIAppShellService);
+  checkService("appinfo", Ci.nsIXULRuntime);
+  checkService("blocklist", Ci.nsIBlocklistService);
+  checkService("cache", Ci.nsICacheService);
+  checkService("clipboard", Ci.nsIClipboard);
+  checkService("console", Ci.nsIConsoleService);
+  checkService("contentPrefs", Ci.nsIContentPrefService);
+  checkService("cookies", Ci.nsICookieManager2);
+  checkService("dirsvc", Ci.nsIDirectoryService);
+  checkService("dirsvc", Ci.nsIProperties);
+  checkService("DOMRequest", Ci.nsIDOMRequestService);
+  checkService("domStorageManager", Ci.nsIDOMStorageManager);
+  checkService("downloads", Ci.nsIDownloadManager);
+  checkService("droppedLinkHandler", Ci.nsIDroppedLinkHandler);
+  checkService("eTLD", Ci.nsIEffectiveTLDService);
+  checkService("focus", Ci.nsIFocusManager);
+  checkService("io", Ci.nsIIOService);
+  checkService("io", Ci.nsIIOService2);
+  checkService("locale", Ci.nsILocaleService);
+  checkService("logins", Ci.nsILoginManager);
+  checkService("obs", Ci.nsIObserverService);
+  checkService("perms", Ci.nsIPermissionManager);
+  checkService("prefs", Ci.nsIPrefBranch);
+  checkService("prefs", Ci.nsIPrefService);
+  checkService("prompt", Ci.nsIPromptService);
+  checkService("scriptSecurityManager", Ci.nsIScriptSecurityManager);
+  checkService("scriptloader", Ci.mozIJSSubScriptLoader);
+  checkService("startup", Ci.nsIAppStartup);
+  checkService("storage", Ci.mozIStorageService);
+  checkService("strings", Ci.nsIStringBundleService);
+  checkService("sysinfo", Ci.nsIPropertyBag2);
+  checkService("telemetry", Ci.nsITelemetry);
+  checkService("tm", Ci.nsIThreadManager);
+  checkService("uriFixup", Ci.nsIURIFixup);
+  checkService("urlFormatter", Ci.nsIURLFormatter);
+  checkService("vc", Ci.nsIVersionComparator);
+  checkService("wm", Ci.nsIWindowMediator);
+  checkService("ww", Ci.nsIWindowWatcher);
+  if ("nsIBrowserSearchService" in Ci) {
+    checkService("search", Ci.nsIBrowserSearchService);
+  }
+
+  // In xpcshell tests, the "@mozilla.org/xre/app-info;1" component implements
+  // only the nsIXULRuntime interface, but not nsIXULAppInfo.  To test the
+  // service getter for the latter interface, we define a minimal mock factory
+  // that returns an object defining both interfaces.
+  let contractID = "@mozilla.org/xre/app-info;1";
+  let mockFactory = {
+    createInstance: function (aOuter, aIid) {
+      return {
+        QueryInterface: XPCOMUtils.generateQI([Ci.nsIXULRuntime,
+                                               Ci.nsIXULAppInfo]),
+      }.QueryInterface(aIid);
+    }
+  };
+
+  let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+  let cid = registrar.contractIDToCID(contractID);
+  let oldFactory = Components.manager.getClassObject(Cc[contractID],
+                                                     Ci.nsIFactory);
+  registrar.unregisterFactory(cid, oldFactory);
+  registrar.registerFactory(cid, "", contractID, mockFactory);
+
+  // We need to reload the module to update the lazy getter.
+  Cu.unload("resource://gre/modules/Services.jsm");
+  Cu.import("resource://gre/modules/Services.jsm");
+
+  checkService("appinfo", Ci.nsIXULAppInfo);
+
+  // Clean up.
+  registrar.unregisterFactory(cid, mockFactory);
+  registrar.registerFactory(cid, "", contractID, oldFactory);
+
+  Cu.unload("resource://gre/modules/Services.jsm");
+}
--- a/toolkit/modules/tests/xpcshell/xpcshell.ini
+++ b/toolkit/modules/tests/xpcshell/xpcshell.ini
@@ -4,12 +4,13 @@ tail =
 
 [test_dict.js]
 [test_FileUtils.js]
 [test_Http.js]
 [test_Preferences.js]
 [test_Promise.js]
 [test_propertyListsUtils.js]
 [test_readCertPrefs.js]
+[test_Services.js]
 [test_sqlite.js]
 [test_task.js]
 [test_TelemetryTimestamps.js]
 [test_timer.js]