Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/widget/gtk/nsWidgetFactory.cpp
Line
Count
Source (jump to first uncovered line)
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 "TaskbarProgress.h"
31
#include "nsColorPicker.h"
32
#include "nsFilePicker.h"
33
#include "nsSound.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 "nsIComponentRegistrar.h"
52
#include "nsComponentManagerUtils.h"
53
#include "mozilla/gfx/2D.h"
54
#include "mozilla/widget/ScreenManager.h"
55
#include <gtk/gtk.h>
56
57
using namespace mozilla;
58
using namespace mozilla::widget;
59
60
NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable)
61
NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter)
62
#ifdef MOZ_X11
63
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceGTK, nsIdleServiceGTK::GetInstance)
64
NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper)
65
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsDragService, nsDragService::GetInstance)
66
#endif
67
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsISound, nsSound::GetInstance)
68
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(ScreenManager, ScreenManager::GetAddRefedSingleton)
69
NS_GENERIC_FACTORY_CONSTRUCTOR(nsImageToPixbuf)
70
NS_GENERIC_FACTORY_CONSTRUCTOR(TaskbarProgress)
71
72
#if defined(MOZ_X11)
73
namespace mozilla {
74
namespace widget {
75
// This constructor should really be shared with all platforms.
76
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init)
77
}
78
}
79
#endif
80
81
#ifdef NS_PRINTING
82
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecGTK)
83
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSettingsServiceGTK, Init)
84
NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorGTK)
85
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init)
86
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintDialogServiceGTK, Init)
87
#endif
88
89
static nsresult
90
nsFilePickerConstructor(nsISupports *aOuter, REFNSIID aIID,
91
                        void **aResult)
92
0
{
93
0
  *aResult = nullptr;
94
0
  if (aOuter != nullptr) {
95
0
    return NS_ERROR_NO_AGGREGATION;
96
0
  }
97
0
98
0
  nsCOMPtr<nsIFilePicker> picker = new nsFilePicker;
99
0
100
0
  return picker->QueryInterface(aIID, aResult);
101
0
}
102
103
#ifdef MOZ_WIDGET_GTK
104
static nsresult
105
nsApplicationChooserConstructor(nsISupports *aOuter, REFNSIID aIID,
106
                                void **aResult)
107
0
{
108
0
  *aResult = nullptr;
109
0
  if (aOuter != nullptr) {
110
0
    return NS_ERROR_NO_AGGREGATION;
111
0
  }
112
0
  nsCOMPtr<nsIApplicationChooser> chooser = new nsApplicationChooser;
113
0
114
0
  if (!chooser) {
115
0
    return NS_ERROR_OUT_OF_MEMORY;
116
0
  }
117
0
118
0
  return chooser->QueryInterface(aIID, aResult);
119
0
}
120
#endif
121
122
static nsresult
123
nsColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID,
124
                         void **aResult)
125
0
{
126
0
    *aResult = nullptr;
127
0
    if (aOuter != nullptr) {
128
0
        return NS_ERROR_NO_AGGREGATION;
129
0
    }
130
0
131
0
    nsCOMPtr<nsIColorPicker> picker = new nsColorPicker;
132
0
133
0
    if (!picker) {
134
0
        return NS_ERROR_OUT_OF_MEMORY;
135
0
    }
136
0
137
0
    return picker->QueryInterface(aIID, aResult);
138
0
}
139
140
static nsresult
141
nsClipboardConstructor(nsISupports *aOuter, REFNSIID aIID,
142
                       void **aResult)
143
0
{
144
0
  *aResult = nullptr;
145
0
  if (aOuter != nullptr) {
146
0
    return NS_ERROR_NO_AGGREGATION;
147
0
  }
148
0
149
0
  nsCOMPtr<nsIClipboard> inst;
150
0
  if (gfxPlatform::IsHeadless()) {
151
0
    inst = new HeadlessClipboard();
152
0
  } else {
153
0
    RefPtr<nsClipboard> clipboard = new nsClipboard();
154
0
    nsresult rv = clipboard->Init();
155
0
    NS_ENSURE_SUCCESS(rv, rv);
156
0
    inst = clipboard;
157
0
  }
158
0
159
0
  return inst->QueryInterface(aIID, aResult);
160
0
}
161
162
NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
163
NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID);
164
NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID);
165
#ifdef MOZ_WIDGET_GTK
166
NS_DEFINE_NAMED_CID(NS_APPLICATIONCHOOSER_CID);
167
#endif
168
NS_DEFINE_NAMED_CID(NS_GTK_TASKBARPROGRESS_CID);
169
NS_DEFINE_NAMED_CID(NS_SOUND_CID);
170
NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID);
171
#ifdef MOZ_X11
172
NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID);
173
NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID);
174
NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID);
175
#endif
176
NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
177
NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
178
#ifdef NS_PRINTING
179
NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID);
180
NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID);
181
NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID);
182
NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID);
183
NS_DEFINE_NAMED_CID(NS_PRINTDIALOGSERVICE_CID);
184
#endif
185
NS_DEFINE_NAMED_CID(NS_IMAGE_TO_PIXBUF_CID);
186
#if defined(MOZ_X11)
187
NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
188
NS_DEFINE_NAMED_CID(NS_GFXINFO_CID);
189
#endif
190
191
192
static const mozilla::Module::CIDEntry kWidgetCIDs[] = {
193
    { &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor, Module::ALLOW_IN_GPU_PROCESS },
194
    { &kNS_COLORPICKER_CID, false, nullptr, nsColorPickerConstructor, Module::MAIN_PROCESS_ONLY },
195
    { &kNS_FILEPICKER_CID, false, nullptr, nsFilePickerConstructor, Module::MAIN_PROCESS_ONLY },
196
#ifdef MOZ_WIDGET_GTK
197
    { &kNS_APPLICATIONCHOOSER_CID, false, nullptr, nsApplicationChooserConstructor, Module::MAIN_PROCESS_ONLY },
198
#endif
199
    { &kNS_GTK_TASKBARPROGRESS_CID, false, nullptr, TaskbarProgressConstructor},
200
    { &kNS_SOUND_CID, false, nullptr, nsISoundConstructor, Module::MAIN_PROCESS_ONLY },
201
    { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor },
202
#ifdef MOZ_X11
203
    { &kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor, Module::MAIN_PROCESS_ONLY },
204
    { &kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor },
205
    { &kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor, Module::MAIN_PROCESS_ONLY },
206
#endif
207
    { &kNS_HTMLFORMATCONVERTER_CID, false, nullptr, nsHTMLFormatConverterConstructor },
208
    { &kNS_SCREENMANAGER_CID, false, nullptr, ScreenManagerConstructor,
209
      Module::MAIN_PROCESS_ONLY },
210
#ifdef NS_PRINTING
211
    { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintSettingsServiceGTKConstructor },
212
    { &kNS_PRINTER_ENUMERATOR_CID, false, nullptr, nsPrinterEnumeratorGTKConstructor },
213
    { &kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor },
214
    { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecGTKConstructor },
215
    { &kNS_PRINTDIALOGSERVICE_CID, false, nullptr, nsPrintDialogServiceGTKConstructor },
216
#endif
217
    { &kNS_IMAGE_TO_PIXBUF_CID, false, nullptr, nsImageToPixbufConstructor },
218
#if defined(MOZ_X11)
219
    { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceGTKConstructor },
220
    { &kNS_GFXINFO_CID, false, nullptr, mozilla::widget::GfxInfoConstructor },
221
#endif
222
    { nullptr }
223
};
224
225
static const mozilla::Module::ContractIDEntry kWidgetContracts[] = {
226
    { "@mozilla.org/widget/appshell/gtk;1", &kNS_APPSHELL_CID, Module::ALLOW_IN_GPU_PROCESS },
227
    { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID, Module::MAIN_PROCESS_ONLY },
228
    { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID, Module::MAIN_PROCESS_ONLY },
229
#ifdef MOZ_WIDGET_GTK
230
    { "@mozilla.org/applicationchooser;1", &kNS_APPLICATIONCHOOSER_CID, Module::MAIN_PROCESS_ONLY },
231
#endif
232
    { "@mozilla.org/widget/taskbarprogress/gtk;1", &kNS_GTK_TASKBARPROGRESS_CID },
233
    { "@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY },
234
    { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID },
235
#ifdef MOZ_X11
236
    { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID, Module::MAIN_PROCESS_ONLY },
237
    { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID },
238
    { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID, Module::MAIN_PROCESS_ONLY },
239
#endif
240
    { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID },
241
    { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID,
242
      Module::MAIN_PROCESS_ONLY },
243
#ifdef NS_PRINTING
244
    { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID },
245
    { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID },
246
    { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID },
247
    { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID },
248
    { NS_PRINTDIALOGSERVICE_CONTRACTID, &kNS_PRINTDIALOGSERVICE_CID },
249
#endif
250
    { "@mozilla.org/widget/image-to-gdk-pixbuf;1", &kNS_IMAGE_TO_PIXBUF_CID },
251
#if defined(MOZ_X11)
252
    { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID },
253
    { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID },
254
#endif
255
    { nullptr }
256
};
257
258
static void
259
nsWidgetGtk2ModuleDtor()
260
0
{
261
0
  // Shutdown all XP level widget classes.
262
0
  WidgetUtils::Shutdown();
263
0
264
0
  NativeKeyBindings::Shutdown();
265
0
  nsLookAndFeel::Shutdown();
266
0
  nsFilePicker::Shutdown();
267
0
  nsSound::Shutdown();
268
0
  nsWindow::ReleaseGlobals();
269
0
  IMContextWrapper::Shutdown();
270
0
  KeymapWrapper::Shutdown();
271
0
  nsGTKToolkit::Shutdown();
272
0
  nsAppShellShutdown();
273
0
#ifdef MOZ_ENABLE_DBUS
274
0
  WakeLockListener::Shutdown();
275
0
#endif
276
0
}
277
278
static const mozilla::Module kWidgetModule = {
279
    mozilla::Module::kVersion,
280
    kWidgetCIDs,
281
    kWidgetContracts,
282
    nullptr,
283
    nullptr,
284
    nsAppShellInit,
285
    nsWidgetGtk2ModuleDtor,
286
    Module::ALLOW_IN_GPU_PROCESS
287
};
288
289
NSMODULE_DEFN(nsWidgetGtk2Module) = &kWidgetModule;