Fix Linux-specific issues with static xpcom registration, bug 568691.
authorBenjamin Smedberg <benjamin@smedbergs.us>
Fri, 11 Jun 2010 12:47:31 -0400
changeset 47000 e6cbe297d1b54135ff7e8cec0c8a3705bb79044a
parent 46999 4f284f668535fb22a3fa04c37e8ad4dfefbefba7
child 47001 267bf53413a9b09da860acd5b61ed34838e130c6
push idunknown
push userunknown
push dateunknown
bugs568691
milestone1.9.3a6pre
Fix Linux-specific issues with static xpcom registration, bug 568691.
uriloader/exthandler/nsDBusHandlerApp.cpp
widget/src/gtk2/nsWidgetFactory.cpp
xpcom/glue/nsIClassInfoImpl.h
--- a/uriloader/exthandler/nsDBusHandlerApp.cpp
+++ b/uriloader/exthandler/nsDBusHandlerApp.cpp
@@ -35,30 +35,30 @@
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include  <dbus/dbus.h>
 #include "nsDBusHandlerApp.h"
 #include "nsIURI.h"
-#include "nsIGenericFactory.h"
 #include "nsIClassInfoImpl.h"
 #include "nsCOMPtr.h"
 
 #if (MOZ_PLATFORM_MAEMO == 5)
 #define APP_LAUNCH_BANNER_SERVICE           "com.nokia.hildon-desktop"
 #define APP_LAUNCH_BANNER_METHOD_INTERFACE  "com.nokia.hildon.hdwm.startupnotification"
 #define APP_LAUNCH_BANNER_METHOD_PATH       "/com/nokia/hildon/hdwm"
 #define APP_LAUNCH_BANNER_METHOD            "starting"
 #endif
 
 
 // XXX why does nsMIMEInfoImpl have a threadsafe nsISupports?  do we need one 
 // here too?
+NS_IMPL_CLASSINFO(nsDBusHandlerApp, NULL, 0)
 NS_IMPL_ISUPPORTS2_CI(nsDBusHandlerApp, nsIDBusHandlerApp, nsIHandlerApp)
 
 ////////////////////////////////////////////////////////////////////////////////
 //// nsIHandlerApp
 
 NS_IMETHODIMP nsDBusHandlerApp::GetName(nsAString& aName)
 {
   aName.Assign(mName);
@@ -232,11 +232,9 @@ NS_IMETHODIMP nsDBusHandlerApp::GetObjec
 }
 
 NS_IMETHODIMP nsDBusHandlerApp::SetObjectPath(const nsACString & aObjpath)
 {
   mObjpath.Assign(aObjpath);
   return NS_OK;
 }
 
-NS_DECL_CLASSINFO(nsDBusHandlerApp)
 
-
--- a/widget/src/gtk2/nsWidgetFactory.cpp
+++ b/widget/src/gtk2/nsWidgetFactory.cpp
@@ -31,17 +31,17 @@
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
-#include "nsIGenericFactory.h"
+#include "mozilla/ModuleUtils.h"
 #include "nsWidgetsCID.h"
 #include "nsAppShell.h"
 #include "nsAppShellSingleton.h"
 #include "nsBaseWidget.h"
 #include "nsLookAndFeel.h"
 #include "nsWindow.h"
 #include "nsTransferable.h"
 #include "nsHTMLFormatConverter.h"
@@ -104,17 +104,17 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenM
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsImageToPixbuf)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsAccelerometerUnix)
 
 
 #ifdef NATIVE_THEME_SUPPORT
 // from nsWindow.cpp
 extern PRBool gDisableNativeTheme;
 
-static NS_IMETHODIMP
+static nsresult
 nsNativeThemeGTKConstructor(nsISupports *aOuter, REFNSIID aIID,
                             void **aResult)
 {
     nsresult rv;
     nsNativeThemeGTK * inst;
 
     if (gDisableNativeTheme)
         return NS_ERROR_NO_INTERFACE;
@@ -145,17 +145,17 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsIdleSer
 #ifdef NS_PRINTING
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsGTK, Init)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorGTK)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceGTK, Init)
 #endif
 
-static NS_IMETHODIMP
+static nsresult
 nsFilePickerConstructor(nsISupports *aOuter, REFNSIID aIID,
                         void **aResult)
 {
   *aResult = nsnull;
   if (aOuter != nsnull) {
     return NS_ERROR_NO_AGGREGATION;
   }
 
@@ -179,17 +179,17 @@ nsFilePickerConstructor(nsISupports *aOu
 
   if (!picker) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
 
   return picker->QueryInterface(aIID, aResult);
 }
 
-static NS_IMETHODIMP
+static nsresult
 nsNativeKeyBindingsConstructor(nsISupports *aOuter, REFNSIID aIID,
                                void **aResult,
                                NativeKeyBindingsType aKeyBindingsType)
 {
     nsresult rv;
 
     nsNativeKeyBindings *inst;
 
@@ -207,153 +207,153 @@ nsNativeKeyBindingsConstructor(nsISuppor
     NS_ADDREF(inst);
     inst->Init(aKeyBindingsType);
     rv = inst->QueryInterface(aIID, aResult);
     NS_RELEASE(inst);
 
     return rv;
 }
 
-static NS_IMETHODIMP
+static nsresult
 nsNativeKeyBindingsInputConstructor(nsISupports *aOuter, REFNSIID aIID,
                                     void **aResult)
 {
     return nsNativeKeyBindingsConstructor(aOuter, aIID, aResult,
                                           eKeyBindings_Input);
 }
 
-static NS_IMETHODIMP
+static nsresult
 nsNativeKeyBindingsTextAreaConstructor(nsISupports *aOuter, REFNSIID aIID,
                                        void **aResult)
 {
     return nsNativeKeyBindingsConstructor(aOuter, aIID, aResult,
                                           eKeyBindings_TextArea);
 }
 
-static const nsModuleComponentInfo components[] =
-{
-    { "Gtk2 Window",
-      NS_WINDOW_CID,
-      "@mozilla.org/widget/window/gtk;1",
-      nsWindowConstructor },
-    { "Gtk2 Child Window",
-      NS_CHILD_CID,
-      "@mozilla.org/widgets/child_window/gtk;1",
-      nsChildWindowConstructor },
-    { "Gtk2 AppShell",
-      NS_APPSHELL_CID,
-      "@mozilla.org/widget/appshell/gtk;1",
-      nsAppShellConstructor },
-    { "Gtk2 Look And Feel",
-      NS_LOOKANDFEEL_CID,
-      "@mozilla.org/widget/lookandfeel;1",
-      nsLookAndFeelConstructor },
-    { "Gtk2 File Picker",
-      NS_FILEPICKER_CID,
-      "@mozilla.org/filepicker;1",
-      nsFilePickerConstructor },
-    { "Gtk2 Sound",
-      NS_SOUND_CID,
-      "@mozilla.org/sound;1",
-      nsSoundConstructor },
-    { "Accelerometer",
-       NS_ACCELEROMETER_CID,
-       NS_ACCELEROMETER_CONTRACTID,
-       nsAccelerometerUnixConstructor },
-    { "Transferable",
-      NS_TRANSFERABLE_CID,
-      "@mozilla.org/widget/transferable;1",
-      nsTransferableConstructor },
-
+NS_DEFINE_NAMED_CID(NS_WINDOW_CID);
+NS_DEFINE_NAMED_CID(NS_CHILD_CID);
+NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
+NS_DEFINE_NAMED_CID(NS_LOOKANDFEEL_CID);
+NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID);
+NS_DEFINE_NAMED_CID(NS_SOUND_CID);
+NS_DEFINE_NAMED_CID(NS_ACCELEROMETER_CID);
+NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID);
 #ifdef MOZ_X11
-  { "Gtk Clipboard",
-    NS_CLIPBOARD_CID,
-    "@mozilla.org/widget/clipboard;1",
-    nsClipboardConstructor },
-  { "Clipboard Helper",
-    NS_CLIPBOARDHELPER_CID,
-    "@mozilla.org/widget/clipboardhelper;1",
-    nsClipboardHelperConstructor },
-  { "Gtk Drag Service",
-    NS_DRAGSERVICE_CID,
-    "@mozilla.org/widget/dragservice;1",
-    nsDragServiceConstructor },
+NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID);
+NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID);
+NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID);
 #endif
-  { "HTML Format Converter",
-    NS_HTMLFORMATCONVERTER_CID,
-    "@mozilla.org/widget/htmlformatconverter;1",
-    nsHTMLFormatConverterConstructor },
-  { "Gtk2 Bidi Keyboard",
-    NS_BIDIKEYBOARD_CID,
-    "@mozilla.org/widget/bidikeyboard;1",
-    nsBidiKeyboardConstructor },
-  { "Input Native Keybindings",
-    NS_NATIVEKEYBINDINGSINPUT_CID,
-    NS_NATIVEKEYBINDINGSINPUT_CONTRACTID,
-    nsNativeKeyBindingsInputConstructor },
-  { "TextArea Native Keybindings",
-    NS_NATIVEKEYBINDINGSTEXTAREA_CID,
-    NS_NATIVEKEYBINDINGSTEXTAREA_CONTRACTID,
-    nsNativeKeyBindingsTextAreaConstructor },
-  { "Editor Native Keybindings",
-    NS_NATIVEKEYBINDINGSEDITOR_CID,
-    NS_NATIVEKEYBINDINGSEDITOR_CONTRACTID,
-    nsNativeKeyBindingsTextAreaConstructor },
-  { "Gtk Screen Manager",
-    NS_SCREENMANAGER_CID,
-    "@mozilla.org/gfx/screenmanager;1",
-    nsScreenManagerGtkConstructor },
+NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
+NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID);
+NS_DEFINE_NAMED_CID(NS_NATIVEKEYBINDINGSINPUT_CID);
+NS_DEFINE_NAMED_CID(NS_NATIVEKEYBINDINGSTEXTAREA_CID);
+NS_DEFINE_NAMED_CID(NS_NATIVEKEYBINDINGSEDITOR_CID);
+NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
 #ifdef NATIVE_THEME_SUPPORT
-   { "Native Theme Renderer",
-    NS_THEMERENDERER_CID,
-    "@mozilla.org/chrome/chrome-native-theme;1",
-     nsNativeThemeGTKConstructor },
+NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID);
 #endif
 #ifdef NS_PRINTING
-  { "PrintSettings Service",
-    NS_PRINTSETTINGSSERVICE_CID,
-    "@mozilla.org/gfx/printsettings-service;1",
-    nsPrintOptionsGTKConstructor },
-  { "Gtk Printer Enumerator",
-    NS_PRINTER_ENUMERATOR_CID,
-    //    "@mozilla.org/gfx/printer_enumerator/gtk;1",
-    "@mozilla.org/gfx/printerenumerator;1",
-    nsPrinterEnumeratorGTKConstructor },
-  { "Print Session",
-    NS_PRINTSESSION_CID,
-    "@mozilla.org/gfx/printsession;1",
-    nsPrintSessionConstructor },
-  { "Gtk Device Context Spec",
-    NS_DEVICE_CONTEXT_SPEC_CID,
-    //    "@mozilla.org/gfx/device_context_spec/gtk;1",
-    "@mozilla.org/gfx/devicecontextspec;1",
-    nsDeviceContextSpecGTKConstructor },
-  { "Native Print Dialog",
-    NS_PRINTDIALOGSERVICE_CID,
-    NS_PRINTDIALOGSERVICE_CONTRACTID,
-    nsPrintDialogServiceGTKConstructor },
+NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID);
+NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID);
+NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID);
+NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID);
+NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID);
 #endif 
-  { "Image to gdk-pixbuf converter",
-    NS_IMAGE_TO_PIXBUF_CID,
-    "@mozilla.org/widget/image-to-gdk-pixbuf;1",
-    nsImageToPixbufConstructor },
+NS_DEFINE_NAMED_CID(NS_IMAGE_TO_PIXBUF_CID);
+#if defined(MOZ_X11)
+NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
+#endif
+
+
+static const mozilla::Module::CIDEntry kWidgetCIDs[] = {
+    { &kNS_WINDOW_CID, false, NULL, nsWindowConstructor },
+    { &kNS_CHILD_CID, false, NULL, nsChildWindowConstructor },
+    { &kNS_APPSHELL_CID, false, NULL, nsAppShellConstructor },
+    { &kNS_LOOKANDFEEL_CID, false, NULL, nsLookAndFeelConstructor },
+    { &kNS_FILEPICKER_CID, false, NULL, nsFilePickerConstructor },
+    { &kNS_SOUND_CID, false, NULL, nsSoundConstructor },
+    { &kNS_ACCELEROMETER_CID, false, NULL, nsAccelerometerUnixConstructor },
+    { &kNS_TRANSFERABLE_CID, false, NULL, nsTransferableConstructor },
+#ifdef MOZ_X11
+    { &kNS_CLIPBOARD_CID, false, NULL, nsClipboardConstructor },
+    { &kNS_CLIPBOARDHELPER_CID, false, NULL, nsClipboardHelperConstructor },
+    { &kNS_DRAGSERVICE_CID, false, NULL, nsDragServiceConstructor },
+#endif
+    { &kNS_HTMLFORMATCONVERTER_CID, false, NULL, nsHTMLFormatConverterConstructor },
+    { &kNS_BIDIKEYBOARD_CID, false, NULL, nsBidiKeyboardConstructor },
+    { &kNS_NATIVEKEYBINDINGSINPUT_CID, false, NULL, nsNativeKeyBindingsInputConstructor },
+    { &kNS_NATIVEKEYBINDINGSTEXTAREA_CID, false, NULL, nsNativeKeyBindingsTextAreaConstructor },
+    { &kNS_NATIVEKEYBINDINGSEDITOR_CID, false, NULL, nsNativeKeyBindingsTextAreaConstructor },
+    { &kNS_SCREENMANAGER_CID, false, NULL, nsScreenManagerGtkConstructor },
+#ifdef NATIVE_THEME_SUPPORT
+    { &kNS_THEMERENDERER_CID, false, NULL, nsNativeThemeGTKConstructor },
+#endif
+#ifdef NS_PRINTING
+    { &kNS_PRINTSETTINGSSERVICE_CID, false, NULL, nsPrintOptionsGTKConstructor },
+    { &kNS_PRINTER_ENUMERATOR_CID, false, NULL, nsPrinterEnumeratorGTKConstructor },
+    { &kNS_PRINTSESSION_CID, false, NULL, nsPrintSessionConstructor },
+    { &kNS_DEVICE_CONTEXT_SPEC_CID, false, NULL, nsDeviceContextSpecGTKConstructor },
+    { &kNS_PRINTDIALOGSERVICE_CID, false, NULL, nsPrintDialogServiceGTKConstructor },
+#endif 
+    { &kNS_IMAGE_TO_PIXBUF_CID, false, NULL, nsImageToPixbufConstructor },
 #if defined(MOZ_X11)
-{ "User Idle Service",
-    NS_IDLE_SERVICE_CID,
-    "@mozilla.org/widget/idleservice;1",
-    nsIdleServiceGTKConstructor },
+    { &kNS_IDLE_SERVICE_CID, false, NULL, nsIdleServiceGTKConstructor },
+#endif
+
+};
+
+static const mozilla::Module::ContractIDEntry kWidgetContracts[] = {
+    { "@mozilla.org/widget/window/gtk;1", &kNS_WINDOW_CID },
+    { "@mozilla.org/widgets/child_window/gtk;1", &kNS_CHILD_CID },
+    { "@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID },
+    { "@mozilla.org/widget/lookandfeel;1", &kNS_LOOKANDFEEL_CID },
+    { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID },
+    { "@mozilla.org/sound;1", &kNS_SOUND_CID },
+    { NS_ACCELEROMETER_CONTRACTID, &kNS_ACCELEROMETER_CID },
+    { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID },
+#ifdef MOZ_X11
+    { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID },
+    { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID },
+    { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID },
+#endif
+    { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID },
+    { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID },
+    { NS_NATIVEKEYBINDINGSINPUT_CONTRACTID, &kNS_NATIVEKEYBINDINGSINPUT_CID },
+    { NS_NATIVEKEYBINDINGSTEXTAREA_CONTRACTID, &kNS_NATIVEKEYBINDINGSTEXTAREA_CID },
+    { NS_NATIVEKEYBINDINGSEDITOR_CONTRACTID, &kNS_NATIVEKEYBINDINGSEDITOR_CID },
+    { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID },
+#ifdef NATIVE_THEME_SUPPORT
+    { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID },
+#endif
+#ifdef NS_PRINTING
+    { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID },
+    { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID },
+    { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID },
+    { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID },
+    { NS_PRINTDIALOGSERVICE_CONTRACTID, &kNS_PRINTDIALOGSERVICE_CID },
+#endif 
+    { "@mozilla.org/widget/image-to-gdk-pixbuf;1", &kNS_IMAGE_TO_PIXBUF_CID },
+#if defined(MOZ_X11)
+    { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID },
 #endif
 
 };
 
 static void
-nsWidgetGtk2ModuleDtor(nsIModule *aSelf)
+nsWidgetGtk2ModuleDtor()
 {
   nsFilePicker::Shutdown();
   nsSound::Shutdown();
   nsWindow::ReleaseGlobals();
-  nsAppShellShutdown(aSelf);
+  nsAppShellShutdown();
 }
 
-NS_IMPL_NSGETMODULE_WITH_CTOR_DTOR(nsWidgetGtk2Module,
-                                   components,
-                                   nsAppShellInit,
-                                   nsWidgetGtk2ModuleDtor)
+static const mozilla::Module kWidgetModule = {
+    mozilla::Module::kVersion,
+    kWidgetCIDs,
+    kWidgetContracts,
+    NULL,
+    NULL,
+    nsAppShellInit,
+    nsWidgetGtk2ModuleDtor
+};
+
+NSMODULE_DEFN(nsWidgetGtk2Module) = &kWidgetModule;
--- a/xpcom/glue/nsIClassInfoImpl.h
+++ b/xpcom/glue/nsIClassInfoImpl.h
@@ -75,17 +75,17 @@ private:
 
 #define NS_IMPL_CLASSINFO(_class, _getlanguagehelper, _flags)           \
   NS_DECL_CI_INTERFACE_GETTER(_class)                                   \
   static const GenericClassInfo::ClassInfoData k##_class##ClassInfoData = { \
     NS_CI_INTERFACE_GETTER_NAME(_class),                                \
     _getlanguagehelper,                                                 \
     _flags                                                              \
   };                                                                    \
-  extern nsIClassInfo* NS_CLASSINFO_NAME(_class) = NULL;
+  nsIClassInfo* NS_CLASSINFO_NAME(_class) = NULL;
 
 #define NS_IMPL_QUERY_CLASSINFO(_class)                                           \
   if ( aIID.Equals(NS_GET_IID(nsIClassInfo)) ) {                                  \
     if (!NS_CLASSINFO_NAME(_class))                                               \
       NS_CLASSINFO_NAME(_class) = new GenericClassInfo(&k##_class##ClassInfoData); \
     foundInterface = NS_CLASSINFO_NAME(_class);                                   \
   } else