1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* vim:expandtab:shiftwidth=4:tabstop=4:
3  */
4 /* This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 
8 #include "mozilla/ModuleUtils.h"
9 #include "mozilla/WidgetUtils.h"
10 #include "NativeKeyBindings.h"
11 #include "nsWidgetsCID.h"
12 #include "nsAppShell.h"
13 #include "nsAppShellSingleton.h"
14 #include "nsBaseWidget.h"
15 #include "nsGtkKeyUtils.h"
16 #include "nsLookAndFeel.h"
17 #include "nsWindow.h"
18 #include "nsTransferable.h"
19 #include "nsHTMLFormatConverter.h"
20 #include "HeadlessClipboard.h"
21 #include "IMContextWrapper.h"
22 #ifdef MOZ_X11
23 #include "nsClipboardHelper.h"
24 #include "nsClipboard.h"
25 #include "nsDragService.h"
26 #endif
27 #ifdef MOZ_WIDGET_GTK
28 #include "nsApplicationChooser.h"
29 #endif
30 #include "nsColorPicker.h"
31 #include "nsFilePicker.h"
32 #include "nsSound.h"
33 #include "nsBidiKeyboard.h"
34 #include "nsGTKToolkit.h"
35 #include "WakeLockListener.h"
36 
37 #ifdef NS_PRINTING
38 #include "nsPrintSettingsServiceGTK.h"
39 #include "nsPrintSession.h"
40 #include "nsDeviceContextSpecG.h"
41 #endif
42 
43 #include "nsImageToPixbuf.h"
44 #include "nsPrintDialogGTK.h"
45 
46 #if defined(MOZ_X11)
47 #include "nsIdleServiceGTK.h"
48 #include "GfxInfoX11.h"
49 #endif
50 
51 #include "nsNativeThemeGTK.h"
52 #include "HeadlessThemeGTK.h"
53 
54 #include "nsIComponentRegistrar.h"
55 #include "nsComponentManagerUtils.h"
56 #include "mozilla/gfx/2D.h"
57 #include "mozilla/widget/ScreenManager.h"
58 #include <gtk/gtk.h>
59 
60 using namespace mozilla;
61 using namespace mozilla::widget;
62 
63 NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow)
64 NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable)
65 NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard)
66 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter)
67 #ifdef MOZ_X11
68 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceGTK,
69                                          nsIdleServiceGTK::GetInstance)
70 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper)
71 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsDragService,
72                                          nsDragService::GetInstance)
73 #endif
74 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsISound, nsSound::GetInstance)
75 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(ScreenManager,
76                                          ScreenManager::GetAddRefedSingleton)
77 NS_GENERIC_FACTORY_CONSTRUCTOR(nsImageToPixbuf)
78 
79 // from nsWindow.cpp
80 extern bool gDisableNativeTheme;
81 
nsNativeThemeGTKConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)82 static nsresult nsNativeThemeGTKConstructor(nsISupports *aOuter, REFNSIID aIID,
83                                             void **aResult) {
84   nsresult rv;
85   nsCOMPtr<nsITheme> inst;
86 
87   if (gDisableNativeTheme) return NS_ERROR_NO_INTERFACE;
88 
89   *aResult = nullptr;
90   if (nullptr != aOuter) {
91     rv = NS_ERROR_NO_AGGREGATION;
92     return rv;
93   }
94   if (gfxPlatform::IsHeadless()) {
95     inst = new HeadlessThemeGTK();
96   } else {
97     inst = new nsNativeThemeGTK();
98   }
99   if (nullptr == inst) {
100     rv = NS_ERROR_OUT_OF_MEMORY;
101     return rv;
102   }
103   rv = inst->QueryInterface(aIID, aResult);
104 
105   return rv;
106 }
107 
108 #if defined(MOZ_X11)
109 namespace mozilla {
110 namespace widget {
111 // This constructor should really be shared with all platforms.
112 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init)
113 }  // namespace widget
114 }  // namespace mozilla
115 #endif
116 
117 #ifdef NS_PRINTING
118 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSettingsServiceGTK,Init)119 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSettingsServiceGTK, Init)
120 NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorGTK)
121 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init)
122 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceGTK, Init)
123 #endif
124 
125 static nsresult nsFilePickerConstructor(nsISupports *aOuter, REFNSIID aIID,
126                                         void **aResult) {
127   *aResult = nullptr;
128   if (aOuter != nullptr) {
129     return NS_ERROR_NO_AGGREGATION;
130   }
131 
132   nsCOMPtr<nsIFilePicker> picker = new nsFilePicker;
133 
134   return picker->QueryInterface(aIID, aResult);
135 }
136 
137 #ifdef MOZ_WIDGET_GTK
nsApplicationChooserConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)138 static nsresult nsApplicationChooserConstructor(nsISupports *aOuter,
139                                                 REFNSIID aIID, void **aResult) {
140   *aResult = nullptr;
141   if (aOuter != nullptr) {
142     return NS_ERROR_NO_AGGREGATION;
143   }
144   nsCOMPtr<nsIApplicationChooser> chooser = new nsApplicationChooser;
145 
146   if (!chooser) {
147     return NS_ERROR_OUT_OF_MEMORY;
148   }
149 
150   return chooser->QueryInterface(aIID, aResult);
151 }
152 #endif
153 
nsColorPickerConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)154 static nsresult nsColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID,
155                                          void **aResult) {
156   *aResult = nullptr;
157   if (aOuter != nullptr) {
158     return NS_ERROR_NO_AGGREGATION;
159   }
160 
161   nsCOMPtr<nsIColorPicker> picker = new nsColorPicker;
162 
163   if (!picker) {
164     return NS_ERROR_OUT_OF_MEMORY;
165   }
166 
167   return picker->QueryInterface(aIID, aResult);
168 }
169 
nsClipboardConstructor(nsISupports * aOuter,REFNSIID aIID,void ** aResult)170 static nsresult nsClipboardConstructor(nsISupports *aOuter, REFNSIID aIID,
171                                        void **aResult) {
172   *aResult = nullptr;
173   if (aOuter != nullptr) {
174     return NS_ERROR_NO_AGGREGATION;
175   }
176 
177   nsCOMPtr<nsIClipboard> inst;
178   if (gfxPlatform::IsHeadless()) {
179     inst = new HeadlessClipboard();
180   } else {
181     RefPtr<nsClipboard> clipboard = new nsClipboard();
182     nsresult rv = clipboard->Init();
183     NS_ENSURE_SUCCESS(rv, rv);
184     inst = clipboard;
185   }
186 
187   return inst->QueryInterface(aIID, aResult);
188 }
189 
190 NS_DEFINE_NAMED_CID(NS_WINDOW_CID);
191 NS_DEFINE_NAMED_CID(NS_CHILD_CID);
192 NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
193 NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID);
194 NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID);
195 #ifdef MOZ_WIDGET_GTK
196 NS_DEFINE_NAMED_CID(NS_APPLICATIONCHOOSER_CID);
197 #endif
198 NS_DEFINE_NAMED_CID(NS_SOUND_CID);
199 NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID);
200 #ifdef MOZ_X11
201 NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID);
202 NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID);
203 NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID);
204 #endif
205 NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
206 NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID);
207 NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
208 NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID);
209 #ifdef NS_PRINTING
210 NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID);
211 NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID);
212 NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID);
213 NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID);
214 NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID);
215 #endif
216 NS_DEFINE_NAMED_CID(NS_IMAGE_TO_PIXBUF_CID);
217 #if defined(MOZ_X11)
218 NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
219 NS_DEFINE_NAMED_CID(NS_GFXINFO_CID);
220 #endif
221 
222 static const mozilla::Module::CIDEntry kWidgetCIDs[] = {
223     {&kNS_WINDOW_CID, false, nullptr, nsWindowConstructor},
224     {&kNS_CHILD_CID, false, nullptr, nsWindowConstructor},
225     {&kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor,
226      Module::ALLOW_IN_GPU_PROCESS},
227     {&kNS_COLORPICKER_CID, false, nullptr, nsColorPickerConstructor,
228      Module::MAIN_PROCESS_ONLY},
229     {&kNS_FILEPICKER_CID, false, nullptr, nsFilePickerConstructor,
230      Module::MAIN_PROCESS_ONLY},
231 #ifdef MOZ_WIDGET_GTK
232     {&kNS_APPLICATIONCHOOSER_CID, false, nullptr,
233      nsApplicationChooserConstructor, Module::MAIN_PROCESS_ONLY},
234 #endif
235     {&kNS_SOUND_CID, false, nullptr, nsISoundConstructor,
236      Module::MAIN_PROCESS_ONLY},
237     {&kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor},
238 #ifdef MOZ_X11
239     {&kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor,
240      Module::MAIN_PROCESS_ONLY},
241     {&kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor},
242     {&kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor,
243      Module::MAIN_PROCESS_ONLY},
244 #endif
245     {&kNS_HTMLFORMATCONVERTER_CID, false, nullptr,
246      nsHTMLFormatConverterConstructor},
247     {&kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor},
248     {&kNS_SCREENMANAGER_CID, false, nullptr, ScreenManagerConstructor,
249      Module::MAIN_PROCESS_ONLY},
250     {&kNS_THEMERENDERER_CID, false, nullptr, nsNativeThemeGTKConstructor},
251 #ifdef NS_PRINTING
252     {&kNS_PRINTSETTINGSSERVICE_CID, false, nullptr,
253      nsPrintSettingsServiceGTKConstructor},
254     {&kNS_PRINTER_ENUMERATOR_CID, false, nullptr,
255      nsPrinterEnumeratorGTKConstructor},
256     {&kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor},
257     {&kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr,
258      nsDeviceContextSpecGTKConstructor},
259     {&kNS_PRINTDIALOGSERVICE_CID, false, nullptr,
260      nsPrintDialogServiceGTKConstructor},
261 #endif
262     {&kNS_IMAGE_TO_PIXBUF_CID, false, nullptr, nsImageToPixbufConstructor},
263 #if defined(MOZ_X11)
264     {&kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceGTKConstructor},
265     {&kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor},
266 #endif
267     {nullptr}};
268 
269 static const mozilla::Module::ContractIDEntry kWidgetContracts[] = {
270     {"@mozilla.org/widget/window/gtk;1", &kNS_WINDOW_CID},
271     {"@mozilla.org/widgets/child_window/gtk;1", &kNS_CHILD_CID},
272     {"@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID,
273      Module::ALLOW_IN_GPU_PROCESS},
274     {"@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID,
275      Module::MAIN_PROCESS_ONLY},
276     {"@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID,
277      Module::MAIN_PROCESS_ONLY},
278 #ifdef MOZ_WIDGET_GTK
279     {"@mozilla.org/applicationchooser;1", &kNS_APPLICATIONCHOOSER_CID,
280      Module::MAIN_PROCESS_ONLY},
281 #endif
282     {"@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY},
283     {"@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID},
284 #ifdef MOZ_X11
285     {"@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID,
286      Module::MAIN_PROCESS_ONLY},
287     {"@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID},
288     {"@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID,
289      Module::MAIN_PROCESS_ONLY},
290 #endif
291     {"@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID},
292     {"@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID,
293      Module::MAIN_PROCESS_ONLY},
294     {"@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID,
295      Module::MAIN_PROCESS_ONLY},
296     {"@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID},
297 #ifdef NS_PRINTING
298     {"@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID},
299     {"@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID},
300     {"@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID},
301     {"@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID},
302     {NS_PRINTDIALOGSERVICE_CONTRACTID, &kNS_PRINTDIALOGSERVICE_CID},
303 #endif
304     {"@mozilla.org/widget/image-to-gdk-pixbuf;1", &kNS_IMAGE_TO_PIXBUF_CID},
305 #if defined(MOZ_X11)
306     {"@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID},
307     {"@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID},
308 #endif
309     {nullptr}};
310 
nsWidgetGtk2ModuleDtor()311 static void nsWidgetGtk2ModuleDtor() {
312   // Shutdown all XP level widget classes.
313   WidgetUtils::Shutdown();
314 
315   NativeKeyBindings::Shutdown();
316   nsLookAndFeel::Shutdown();
317   nsFilePicker::Shutdown();
318   nsSound::Shutdown();
319   nsWindow::ReleaseGlobals();
320   IMContextWrapper::Shutdown();
321   KeymapWrapper::Shutdown();
322   nsGTKToolkit::Shutdown();
323   nsAppShellShutdown();
324 #ifdef MOZ_ENABLE_DBUS
325   WakeLockListener::Shutdown();
326 #endif
327 }
328 
329 static const mozilla::Module kWidgetModule = {mozilla::Module::kVersion,
330                                               kWidgetCIDs,
331                                               kWidgetContracts,
332                                               nullptr,
333                                               nullptr,
334                                               nsAppShellInit,
335                                               nsWidgetGtk2ModuleDtor,
336                                               Module::ALLOW_IN_GPU_PROCESS};
337 
338 NSMODULE_DEFN(nsWidgetGtk2Module) = &kWidgetModule;
339