widget/windows/nsWidgetFactory.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/widget/windows/nsWidgetFactory.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,314 @@
     1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +
    1.10 +#include "nsIFactory.h"
    1.11 +#include "nsISupports.h"
    1.12 +#include "nsdefs.h"
    1.13 +#include "nsWidgetsCID.h"
    1.14 +#include "nsAppShell.h"
    1.15 +#include "nsAppShellSingleton.h"
    1.16 +#include "mozilla/ModuleUtils.h"
    1.17 +#include "nsIServiceManager.h"
    1.18 +#include "nsIdleServiceWin.h"
    1.19 +#include "nsLookAndFeel.h"
    1.20 +#include "nsScreenManagerWin.h"
    1.21 +#include "nsSound.h"
    1.22 +#include "WinMouseScrollHandler.h"
    1.23 +#include "KeyboardLayout.h"
    1.24 +#include "GfxInfo.h"
    1.25 +#include "nsToolkit.h"
    1.26 +
    1.27 +// Modules that switch out based on the environment
    1.28 +#include "nsXULAppAPI.h"
    1.29 +// Desktop
    1.30 +#include "nsFilePicker.h" // needs to be included before other shobjidl.h includes
    1.31 +#include "nsColorPicker.h"
    1.32 +#include "nsNativeThemeWin.h"
    1.33 +#include "nsWindow.h"
    1.34 +// Content processes
    1.35 +#include "nsFilePickerProxy.h"
    1.36 +// Metro
    1.37 +#ifdef MOZ_METRO
    1.38 +#include "winrt/MetroAppShell.h"
    1.39 +#include "winrt/MetroWidget.h"
    1.40 +#include "winrt/nsMetroFilePicker.h"
    1.41 +#include "winrt/nsWinMetroUtils.h"
    1.42 +#endif
    1.43 +
    1.44 +// Drag & Drop, Clipboard
    1.45 +#include "nsClipboardHelper.h"
    1.46 +#include "nsClipboard.h"
    1.47 +#include "nsBidiKeyboard.h"
    1.48 +#include "nsDragService.h"
    1.49 +#include "nsTransferable.h"
    1.50 +#include "nsHTMLFormatConverter.h"
    1.51 +
    1.52 +#include "WinTaskbar.h"
    1.53 +#include "JumpListBuilder.h"
    1.54 +#include "JumpListItem.h"
    1.55 +
    1.56 +#ifdef NS_PRINTING
    1.57 +#include "nsDeviceContextSpecWin.h"
    1.58 +#include "nsPrintOptionsWin.h"
    1.59 +#include "nsPrintSession.h"
    1.60 +#endif
    1.61 +
    1.62 +#include "mozilla/Module.h"
    1.63 +
    1.64 +using namespace mozilla;
    1.65 +using namespace mozilla::widget;
    1.66 +
    1.67 +static nsresult
    1.68 +WindowConstructor(nsISupports *aOuter, REFNSIID aIID,
    1.69 +                  void **aResult)
    1.70 +{
    1.71 +  *aResult = nullptr;
    1.72 +  if (aOuter != nullptr) {
    1.73 +    return NS_ERROR_NO_AGGREGATION;
    1.74 +  }
    1.75 +  nsCOMPtr<nsIWidget> widget;
    1.76 +
    1.77 +  if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
    1.78 +#ifdef MOZ_METRO
    1.79 +    widget = new MetroWidget;
    1.80 +#else
    1.81 +    NS_RUNTIMEABORT("build does not support metro.");
    1.82 +#endif
    1.83 +  } else {
    1.84 +    widget = new nsWindow;
    1.85 +  }
    1.86 +
    1.87 +  return widget->QueryInterface(aIID, aResult);
    1.88 +}
    1.89 +
    1.90 +static nsresult
    1.91 +ChildWindowConstructor(nsISupports *aOuter, REFNSIID aIID,
    1.92 +                       void **aResult)
    1.93 +{
    1.94 +  *aResult = nullptr;
    1.95 +  if (aOuter != nullptr) {
    1.96 +    return NS_ERROR_NO_AGGREGATION;
    1.97 +  }
    1.98 +  nsCOMPtr<nsIWidget> widget;
    1.99 +
   1.100 +  if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
   1.101 +    return NS_NOINTERFACE;
   1.102 +  } else {
   1.103 +    widget = new ChildWindow;
   1.104 +  }
   1.105 +
   1.106 +  return widget->QueryInterface(aIID, aResult);
   1.107 +}
   1.108 +
   1.109 +static nsresult
   1.110 +FilePickerConstructor(nsISupports *aOuter, REFNSIID aIID,
   1.111 +                      void **aResult)
   1.112 +{
   1.113 +  *aResult = nullptr;
   1.114 +  if (aOuter != nullptr) {
   1.115 +    return NS_ERROR_NO_AGGREGATION;
   1.116 +  }
   1.117 +  nsCOMPtr<nsIFilePicker> picker;
   1.118 +
   1.119 +  if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
   1.120 +#ifdef MOZ_METRO
   1.121 +    picker = new nsMetroFilePicker;
   1.122 +#else
   1.123 +    NS_RUNTIMEABORT("build does not support metro.");
   1.124 +#endif
   1.125 +  } else {
   1.126 +    picker = new nsFilePicker;
   1.127 +  }
   1.128 +  return picker->QueryInterface(aIID, aResult);
   1.129 +}
   1.130 +
   1.131 +static nsresult
   1.132 +ColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID,
   1.133 +                       void **aResult)
   1.134 +{
   1.135 +  *aResult = nullptr;
   1.136 +  if (aOuter != nullptr) {
   1.137 +    return NS_ERROR_NO_AGGREGATION;
   1.138 +  }
   1.139 +  nsCOMPtr<nsIColorPicker> picker;
   1.140 +
   1.141 +  if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
   1.142 +#ifdef MOZ_METRO
   1.143 +    // TODO
   1.144 +    // picker = new nsMetroColorPicker;
   1.145 +    NS_ERROR("metro color picker isn't implemented currently");
   1.146 +    return NS_ERROR_NO_INTERFACE;
   1.147 +#else
   1.148 +    NS_RUNTIMEABORT("build does not support metro.");
   1.149 +#endif
   1.150 +  } else {
   1.151 +    picker = new nsColorPicker;
   1.152 +  }
   1.153 +  return picker->QueryInterface(aIID, aResult);
   1.154 +}
   1.155 +
   1.156 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerWin)
   1.157 +NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceWin, nsIdleServiceWin::GetInstance)
   1.158 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboard)
   1.159 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper)
   1.160 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsSound)
   1.161 +NS_GENERIC_FACTORY_CONSTRUCTOR(WinTaskbar)
   1.162 +NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListBuilder)
   1.163 +NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListItem)
   1.164 +NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListSeparator)
   1.165 +NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListLink)
   1.166 +NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListShortcut)
   1.167 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable)
   1.168 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter)
   1.169 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsDragService)
   1.170 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard)
   1.171 +#ifdef MOZ_METRO
   1.172 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsWinMetroUtils)
   1.173 +#endif
   1.174 +#ifdef NS_PRINTING
   1.175 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsWin, Init)
   1.176 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorWin)
   1.177 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init)
   1.178 +NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecWin)
   1.179 +#endif
   1.180 +
   1.181 +namespace mozilla {
   1.182 +namespace widget {
   1.183 +// This constructor should really be shared with all platforms.
   1.184 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init)
   1.185 +}
   1.186 +}
   1.187 +
   1.188 +NS_DEFINE_NAMED_CID(NS_WINDOW_CID);
   1.189 +NS_DEFINE_NAMED_CID(NS_CHILD_CID);
   1.190 +NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID);
   1.191 +NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID);
   1.192 +NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
   1.193 +NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
   1.194 +NS_DEFINE_NAMED_CID(NS_GFXINFO_CID);
   1.195 +NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID);
   1.196 +NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
   1.197 +NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID);
   1.198 +NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID);
   1.199 +NS_DEFINE_NAMED_CID(NS_SOUND_CID);
   1.200 +NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID);
   1.201 +NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
   1.202 +NS_DEFINE_NAMED_CID(NS_WIN_TASKBAR_CID);
   1.203 +NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTBUILDER_CID);
   1.204 +NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTITEM_CID);
   1.205 +NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTSEPARATOR_CID);
   1.206 +NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTLINK_CID);
   1.207 +NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTSHORTCUT_CID);
   1.208 +#ifdef MOZ_METRO
   1.209 +NS_DEFINE_NAMED_CID(NS_WIN_METROUTILS_CID);
   1.210 +#endif
   1.211 +NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID);
   1.212 +NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID);
   1.213 +#ifdef NS_PRINTING
   1.214 +NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID);
   1.215 +NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID);
   1.216 +NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID);
   1.217 +NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID);
   1.218 +#endif
   1.219 +
   1.220 +
   1.221 +static const mozilla::Module::CIDEntry kWidgetCIDs[] = {
   1.222 +  { &kNS_WINDOW_CID, false, nullptr, WindowConstructor },
   1.223 +  { &kNS_CHILD_CID, false, nullptr, ChildWindowConstructor },
   1.224 +  { &kNS_FILEPICKER_CID, false, nullptr, FilePickerConstructor, Module::MAIN_PROCESS_ONLY },
   1.225 +  { &kNS_COLORPICKER_CID, false, nullptr, ColorPickerConstructor, Module::MAIN_PROCESS_ONLY },
   1.226 +  { &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor },
   1.227 +  { &kNS_SCREENMANAGER_CID, false, nullptr, nsScreenManagerWinConstructor },
   1.228 +  { &kNS_GFXINFO_CID, false, nullptr, GfxInfoConstructor },
   1.229 +  { &kNS_THEMERENDERER_CID, false, nullptr, NS_NewNativeTheme },
   1.230 +  { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceWinConstructor },
   1.231 +  { &kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor, Module::MAIN_PROCESS_ONLY },
   1.232 +  { &kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor },
   1.233 +  { &kNS_SOUND_CID, false, nullptr, nsSoundConstructor, Module::MAIN_PROCESS_ONLY },
   1.234 +  { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor },
   1.235 +  { &kNS_HTMLFORMATCONVERTER_CID, false, nullptr, nsHTMLFormatConverterConstructor },
   1.236 +  { &kNS_WIN_TASKBAR_CID, false, nullptr, WinTaskbarConstructor },
   1.237 +  { &kNS_WIN_JUMPLISTBUILDER_CID, false, nullptr, JumpListBuilderConstructor },
   1.238 +  { &kNS_WIN_JUMPLISTITEM_CID, false, nullptr, JumpListItemConstructor },
   1.239 +  { &kNS_WIN_JUMPLISTSEPARATOR_CID, false, nullptr, JumpListSeparatorConstructor },
   1.240 +  { &kNS_WIN_JUMPLISTLINK_CID, false, nullptr, JumpListLinkConstructor },
   1.241 +  { &kNS_WIN_JUMPLISTSHORTCUT_CID, false, nullptr, JumpListShortcutConstructor },
   1.242 +  { &kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor, Module::MAIN_PROCESS_ONLY },
   1.243 +  { &kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor },
   1.244 +#ifdef MOZ_METRO
   1.245 +  { &kNS_WIN_METROUTILS_CID, false, nullptr, nsWinMetroUtilsConstructor },
   1.246 +#endif
   1.247 +#ifdef NS_PRINTING
   1.248 +  { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintOptionsWinConstructor },
   1.249 +  { &kNS_PRINTER_ENUMERATOR_CID, false, nullptr, nsPrinterEnumeratorWinConstructor,
   1.250 +    Module::MAIN_PROCESS_ONLY },
   1.251 +  { &kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor,
   1.252 +    Module::MAIN_PROCESS_ONLY },
   1.253 +  { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecWinConstructor,
   1.254 +    Module::MAIN_PROCESS_ONLY },
   1.255 +#endif
   1.256 +  { nullptr }
   1.257 +};
   1.258 +
   1.259 +static const mozilla::Module::ContractIDEntry kWidgetContracts[] = {
   1.260 +  { "@mozilla.org/widgets/window/win;1", &kNS_WINDOW_CID },
   1.261 +  { "@mozilla.org/widgets/child_window/win;1", &kNS_CHILD_CID },
   1.262 +  { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID, Module::MAIN_PROCESS_ONLY },
   1.263 +  { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID, Module::MAIN_PROCESS_ONLY },
   1.264 +  { "@mozilla.org/widget/appshell/win;1", &kNS_APPSHELL_CID },
   1.265 +  { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID },
   1.266 +  { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID },
   1.267 +  { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID },
   1.268 +  { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID },
   1.269 +  { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID, Module::MAIN_PROCESS_ONLY },
   1.270 +  { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID },
   1.271 +  { "@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY },
   1.272 +  { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID },
   1.273 +  { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID },
   1.274 +  { "@mozilla.org/windows-taskbar;1", &kNS_WIN_TASKBAR_CID },
   1.275 +  { "@mozilla.org/windows-jumplistbuilder;1", &kNS_WIN_JUMPLISTBUILDER_CID },
   1.276 +  { "@mozilla.org/windows-jumplistitem;1", &kNS_WIN_JUMPLISTITEM_CID },
   1.277 +  { "@mozilla.org/windows-jumplistseparator;1", &kNS_WIN_JUMPLISTSEPARATOR_CID },
   1.278 +  { "@mozilla.org/windows-jumplistlink;1", &kNS_WIN_JUMPLISTLINK_CID },
   1.279 +  { "@mozilla.org/windows-jumplistshortcut;1", &kNS_WIN_JUMPLISTSHORTCUT_CID },
   1.280 +  { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID, Module::MAIN_PROCESS_ONLY },
   1.281 +  { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID },
   1.282 +#ifdef MOZ_METRO
   1.283 +  { "@mozilla.org/windows-metroutils;1", &kNS_WIN_METROUTILS_CID },
   1.284 +#endif
   1.285 +#ifdef NS_PRINTING
   1.286 +  { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID },
   1.287 +  { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID,
   1.288 +    Module::MAIN_PROCESS_ONLY },
   1.289 +  { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID,
   1.290 +    Module::MAIN_PROCESS_ONLY },
   1.291 +  { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID,
   1.292 +    Module::MAIN_PROCESS_ONLY },
   1.293 +#endif
   1.294 +  { nullptr }
   1.295 +};
   1.296 +
   1.297 +static void
   1.298 +nsWidgetWindowsModuleDtor()
   1.299 +{
   1.300 +  KeyboardLayout::Shutdown();
   1.301 +  MouseScrollHandler::Shutdown();
   1.302 +  nsLookAndFeel::Shutdown();
   1.303 +  nsToolkit::Shutdown();
   1.304 +  nsAppShellShutdown();
   1.305 +}
   1.306 +
   1.307 +static const mozilla::Module kWidgetModule = {
   1.308 +  mozilla::Module::kVersion,
   1.309 +  kWidgetCIDs,
   1.310 +  kWidgetContracts,
   1.311 +  nullptr,
   1.312 +  nullptr,
   1.313 +  nsAppShellInit,
   1.314 +  nsWidgetWindowsModuleDtor
   1.315 +};
   1.316 +
   1.317 +NSMODULE_DEFN(nsWidgetModule) = &kWidgetModule;

mercurial