widget/windows/nsWidgetFactory.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #include "nsIFactory.h"
     8 #include "nsISupports.h"
     9 #include "nsdefs.h"
    10 #include "nsWidgetsCID.h"
    11 #include "nsAppShell.h"
    12 #include "nsAppShellSingleton.h"
    13 #include "mozilla/ModuleUtils.h"
    14 #include "nsIServiceManager.h"
    15 #include "nsIdleServiceWin.h"
    16 #include "nsLookAndFeel.h"
    17 #include "nsScreenManagerWin.h"
    18 #include "nsSound.h"
    19 #include "WinMouseScrollHandler.h"
    20 #include "KeyboardLayout.h"
    21 #include "GfxInfo.h"
    22 #include "nsToolkit.h"
    24 // Modules that switch out based on the environment
    25 #include "nsXULAppAPI.h"
    26 // Desktop
    27 #include "nsFilePicker.h" // needs to be included before other shobjidl.h includes
    28 #include "nsColorPicker.h"
    29 #include "nsNativeThemeWin.h"
    30 #include "nsWindow.h"
    31 // Content processes
    32 #include "nsFilePickerProxy.h"
    33 // Metro
    34 #ifdef MOZ_METRO
    35 #include "winrt/MetroAppShell.h"
    36 #include "winrt/MetroWidget.h"
    37 #include "winrt/nsMetroFilePicker.h"
    38 #include "winrt/nsWinMetroUtils.h"
    39 #endif
    41 // Drag & Drop, Clipboard
    42 #include "nsClipboardHelper.h"
    43 #include "nsClipboard.h"
    44 #include "nsBidiKeyboard.h"
    45 #include "nsDragService.h"
    46 #include "nsTransferable.h"
    47 #include "nsHTMLFormatConverter.h"
    49 #include "WinTaskbar.h"
    50 #include "JumpListBuilder.h"
    51 #include "JumpListItem.h"
    53 #ifdef NS_PRINTING
    54 #include "nsDeviceContextSpecWin.h"
    55 #include "nsPrintOptionsWin.h"
    56 #include "nsPrintSession.h"
    57 #endif
    59 #include "mozilla/Module.h"
    61 using namespace mozilla;
    62 using namespace mozilla::widget;
    64 static nsresult
    65 WindowConstructor(nsISupports *aOuter, REFNSIID aIID,
    66                   void **aResult)
    67 {
    68   *aResult = nullptr;
    69   if (aOuter != nullptr) {
    70     return NS_ERROR_NO_AGGREGATION;
    71   }
    72   nsCOMPtr<nsIWidget> widget;
    74   if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
    75 #ifdef MOZ_METRO
    76     widget = new MetroWidget;
    77 #else
    78     NS_RUNTIMEABORT("build does not support metro.");
    79 #endif
    80   } else {
    81     widget = new nsWindow;
    82   }
    84   return widget->QueryInterface(aIID, aResult);
    85 }
    87 static nsresult
    88 ChildWindowConstructor(nsISupports *aOuter, REFNSIID aIID,
    89                        void **aResult)
    90 {
    91   *aResult = nullptr;
    92   if (aOuter != nullptr) {
    93     return NS_ERROR_NO_AGGREGATION;
    94   }
    95   nsCOMPtr<nsIWidget> widget;
    97   if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
    98     return NS_NOINTERFACE;
    99   } else {
   100     widget = new ChildWindow;
   101   }
   103   return widget->QueryInterface(aIID, aResult);
   104 }
   106 static nsresult
   107 FilePickerConstructor(nsISupports *aOuter, REFNSIID aIID,
   108                       void **aResult)
   109 {
   110   *aResult = nullptr;
   111   if (aOuter != nullptr) {
   112     return NS_ERROR_NO_AGGREGATION;
   113   }
   114   nsCOMPtr<nsIFilePicker> picker;
   116   if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
   117 #ifdef MOZ_METRO
   118     picker = new nsMetroFilePicker;
   119 #else
   120     NS_RUNTIMEABORT("build does not support metro.");
   121 #endif
   122   } else {
   123     picker = new nsFilePicker;
   124   }
   125   return picker->QueryInterface(aIID, aResult);
   126 }
   128 static nsresult
   129 ColorPickerConstructor(nsISupports *aOuter, REFNSIID aIID,
   130                        void **aResult)
   131 {
   132   *aResult = nullptr;
   133   if (aOuter != nullptr) {
   134     return NS_ERROR_NO_AGGREGATION;
   135   }
   136   nsCOMPtr<nsIColorPicker> picker;
   138   if (XRE_GetWindowsEnvironment() == WindowsEnvironmentType_Metro) {
   139 #ifdef MOZ_METRO
   140     // TODO
   141     // picker = new nsMetroColorPicker;
   142     NS_ERROR("metro color picker isn't implemented currently");
   143     return NS_ERROR_NO_INTERFACE;
   144 #else
   145     NS_RUNTIMEABORT("build does not support metro.");
   146 #endif
   147   } else {
   148     picker = new nsColorPicker;
   149   }
   150   return picker->QueryInterface(aIID, aResult);
   151 }
   153 NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerWin)
   154 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceWin, nsIdleServiceWin::GetInstance)
   155 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboard)
   156 NS_GENERIC_FACTORY_CONSTRUCTOR(nsClipboardHelper)
   157 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSound)
   158 NS_GENERIC_FACTORY_CONSTRUCTOR(WinTaskbar)
   159 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListBuilder)
   160 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListItem)
   161 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListSeparator)
   162 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListLink)
   163 NS_GENERIC_FACTORY_CONSTRUCTOR(JumpListShortcut)
   164 NS_GENERIC_FACTORY_CONSTRUCTOR(nsTransferable)
   165 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter)
   166 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDragService)
   167 NS_GENERIC_FACTORY_CONSTRUCTOR(nsBidiKeyboard)
   168 #ifdef MOZ_METRO
   169 NS_GENERIC_FACTORY_CONSTRUCTOR(nsWinMetroUtils)
   170 #endif
   171 #ifdef NS_PRINTING
   172 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintOptionsWin, Init)
   173 NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrinterEnumeratorWin)
   174 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPrintSession, Init)
   175 NS_GENERIC_FACTORY_CONSTRUCTOR(nsDeviceContextSpecWin)
   176 #endif
   178 namespace mozilla {
   179 namespace widget {
   180 // This constructor should really be shared with all platforms.
   181 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init)
   182 }
   183 }
   185 NS_DEFINE_NAMED_CID(NS_WINDOW_CID);
   186 NS_DEFINE_NAMED_CID(NS_CHILD_CID);
   187 NS_DEFINE_NAMED_CID(NS_FILEPICKER_CID);
   188 NS_DEFINE_NAMED_CID(NS_COLORPICKER_CID);
   189 NS_DEFINE_NAMED_CID(NS_APPSHELL_CID);
   190 NS_DEFINE_NAMED_CID(NS_SCREENMANAGER_CID);
   191 NS_DEFINE_NAMED_CID(NS_GFXINFO_CID);
   192 NS_DEFINE_NAMED_CID(NS_THEMERENDERER_CID);
   193 NS_DEFINE_NAMED_CID(NS_IDLE_SERVICE_CID);
   194 NS_DEFINE_NAMED_CID(NS_CLIPBOARD_CID);
   195 NS_DEFINE_NAMED_CID(NS_CLIPBOARDHELPER_CID);
   196 NS_DEFINE_NAMED_CID(NS_SOUND_CID);
   197 NS_DEFINE_NAMED_CID(NS_TRANSFERABLE_CID);
   198 NS_DEFINE_NAMED_CID(NS_HTMLFORMATCONVERTER_CID);
   199 NS_DEFINE_NAMED_CID(NS_WIN_TASKBAR_CID);
   200 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTBUILDER_CID);
   201 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTITEM_CID);
   202 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTSEPARATOR_CID);
   203 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTLINK_CID);
   204 NS_DEFINE_NAMED_CID(NS_WIN_JUMPLISTSHORTCUT_CID);
   205 #ifdef MOZ_METRO
   206 NS_DEFINE_NAMED_CID(NS_WIN_METROUTILS_CID);
   207 #endif
   208 NS_DEFINE_NAMED_CID(NS_DRAGSERVICE_CID);
   209 NS_DEFINE_NAMED_CID(NS_BIDIKEYBOARD_CID);
   210 #ifdef NS_PRINTING
   211 NS_DEFINE_NAMED_CID(NS_PRINTSETTINGSSERVICE_CID);
   212 NS_DEFINE_NAMED_CID(NS_PRINTER_ENUMERATOR_CID);
   213 NS_DEFINE_NAMED_CID(NS_PRINTSESSION_CID);
   214 NS_DEFINE_NAMED_CID(NS_DEVICE_CONTEXT_SPEC_CID);
   215 #endif
   218 static const mozilla::Module::CIDEntry kWidgetCIDs[] = {
   219   { &kNS_WINDOW_CID, false, nullptr, WindowConstructor },
   220   { &kNS_CHILD_CID, false, nullptr, ChildWindowConstructor },
   221   { &kNS_FILEPICKER_CID, false, nullptr, FilePickerConstructor, Module::MAIN_PROCESS_ONLY },
   222   { &kNS_COLORPICKER_CID, false, nullptr, ColorPickerConstructor, Module::MAIN_PROCESS_ONLY },
   223   { &kNS_APPSHELL_CID, false, nullptr, nsAppShellConstructor },
   224   { &kNS_SCREENMANAGER_CID, false, nullptr, nsScreenManagerWinConstructor },
   225   { &kNS_GFXINFO_CID, false, nullptr, GfxInfoConstructor },
   226   { &kNS_THEMERENDERER_CID, false, nullptr, NS_NewNativeTheme },
   227   { &kNS_IDLE_SERVICE_CID, false, nullptr, nsIdleServiceWinConstructor },
   228   { &kNS_CLIPBOARD_CID, false, nullptr, nsClipboardConstructor, Module::MAIN_PROCESS_ONLY },
   229   { &kNS_CLIPBOARDHELPER_CID, false, nullptr, nsClipboardHelperConstructor },
   230   { &kNS_SOUND_CID, false, nullptr, nsSoundConstructor, Module::MAIN_PROCESS_ONLY },
   231   { &kNS_TRANSFERABLE_CID, false, nullptr, nsTransferableConstructor },
   232   { &kNS_HTMLFORMATCONVERTER_CID, false, nullptr, nsHTMLFormatConverterConstructor },
   233   { &kNS_WIN_TASKBAR_CID, false, nullptr, WinTaskbarConstructor },
   234   { &kNS_WIN_JUMPLISTBUILDER_CID, false, nullptr, JumpListBuilderConstructor },
   235   { &kNS_WIN_JUMPLISTITEM_CID, false, nullptr, JumpListItemConstructor },
   236   { &kNS_WIN_JUMPLISTSEPARATOR_CID, false, nullptr, JumpListSeparatorConstructor },
   237   { &kNS_WIN_JUMPLISTLINK_CID, false, nullptr, JumpListLinkConstructor },
   238   { &kNS_WIN_JUMPLISTSHORTCUT_CID, false, nullptr, JumpListShortcutConstructor },
   239   { &kNS_DRAGSERVICE_CID, false, nullptr, nsDragServiceConstructor, Module::MAIN_PROCESS_ONLY },
   240   { &kNS_BIDIKEYBOARD_CID, false, nullptr, nsBidiKeyboardConstructor },
   241 #ifdef MOZ_METRO
   242   { &kNS_WIN_METROUTILS_CID, false, nullptr, nsWinMetroUtilsConstructor },
   243 #endif
   244 #ifdef NS_PRINTING
   245   { &kNS_PRINTSETTINGSSERVICE_CID, false, nullptr, nsPrintOptionsWinConstructor },
   246   { &kNS_PRINTER_ENUMERATOR_CID, false, nullptr, nsPrinterEnumeratorWinConstructor,
   247     Module::MAIN_PROCESS_ONLY },
   248   { &kNS_PRINTSESSION_CID, false, nullptr, nsPrintSessionConstructor,
   249     Module::MAIN_PROCESS_ONLY },
   250   { &kNS_DEVICE_CONTEXT_SPEC_CID, false, nullptr, nsDeviceContextSpecWinConstructor,
   251     Module::MAIN_PROCESS_ONLY },
   252 #endif
   253   { nullptr }
   254 };
   256 static const mozilla::Module::ContractIDEntry kWidgetContracts[] = {
   257   { "@mozilla.org/widgets/window/win;1", &kNS_WINDOW_CID },
   258   { "@mozilla.org/widgets/child_window/win;1", &kNS_CHILD_CID },
   259   { "@mozilla.org/filepicker;1", &kNS_FILEPICKER_CID, Module::MAIN_PROCESS_ONLY },
   260   { "@mozilla.org/colorpicker;1", &kNS_COLORPICKER_CID, Module::MAIN_PROCESS_ONLY },
   261   { "@mozilla.org/widget/appshell/win;1", &kNS_APPSHELL_CID },
   262   { "@mozilla.org/gfx/screenmanager;1", &kNS_SCREENMANAGER_CID },
   263   { "@mozilla.org/gfx/info;1", &kNS_GFXINFO_CID },
   264   { "@mozilla.org/chrome/chrome-native-theme;1", &kNS_THEMERENDERER_CID },
   265   { "@mozilla.org/widget/idleservice;1", &kNS_IDLE_SERVICE_CID },
   266   { "@mozilla.org/widget/clipboard;1", &kNS_CLIPBOARD_CID, Module::MAIN_PROCESS_ONLY },
   267   { "@mozilla.org/widget/clipboardhelper;1", &kNS_CLIPBOARDHELPER_CID },
   268   { "@mozilla.org/sound;1", &kNS_SOUND_CID, Module::MAIN_PROCESS_ONLY },
   269   { "@mozilla.org/widget/transferable;1", &kNS_TRANSFERABLE_CID },
   270   { "@mozilla.org/widget/htmlformatconverter;1", &kNS_HTMLFORMATCONVERTER_CID },
   271   { "@mozilla.org/windows-taskbar;1", &kNS_WIN_TASKBAR_CID },
   272   { "@mozilla.org/windows-jumplistbuilder;1", &kNS_WIN_JUMPLISTBUILDER_CID },
   273   { "@mozilla.org/windows-jumplistitem;1", &kNS_WIN_JUMPLISTITEM_CID },
   274   { "@mozilla.org/windows-jumplistseparator;1", &kNS_WIN_JUMPLISTSEPARATOR_CID },
   275   { "@mozilla.org/windows-jumplistlink;1", &kNS_WIN_JUMPLISTLINK_CID },
   276   { "@mozilla.org/windows-jumplistshortcut;1", &kNS_WIN_JUMPLISTSHORTCUT_CID },
   277   { "@mozilla.org/widget/dragservice;1", &kNS_DRAGSERVICE_CID, Module::MAIN_PROCESS_ONLY },
   278   { "@mozilla.org/widget/bidikeyboard;1", &kNS_BIDIKEYBOARD_CID },
   279 #ifdef MOZ_METRO
   280   { "@mozilla.org/windows-metroutils;1", &kNS_WIN_METROUTILS_CID },
   281 #endif
   282 #ifdef NS_PRINTING
   283   { "@mozilla.org/gfx/printsettings-service;1", &kNS_PRINTSETTINGSSERVICE_CID },
   284   { "@mozilla.org/gfx/printerenumerator;1", &kNS_PRINTER_ENUMERATOR_CID,
   285     Module::MAIN_PROCESS_ONLY },
   286   { "@mozilla.org/gfx/printsession;1", &kNS_PRINTSESSION_CID,
   287     Module::MAIN_PROCESS_ONLY },
   288   { "@mozilla.org/gfx/devicecontextspec;1", &kNS_DEVICE_CONTEXT_SPEC_CID,
   289     Module::MAIN_PROCESS_ONLY },
   290 #endif
   291   { nullptr }
   292 };
   294 static void
   295 nsWidgetWindowsModuleDtor()
   296 {
   297   KeyboardLayout::Shutdown();
   298   MouseScrollHandler::Shutdown();
   299   nsLookAndFeel::Shutdown();
   300   nsToolkit::Shutdown();
   301   nsAppShellShutdown();
   302 }
   304 static const mozilla::Module kWidgetModule = {
   305   mozilla::Module::kVersion,
   306   kWidgetCIDs,
   307   kWidgetContracts,
   308   nullptr,
   309   nullptr,
   310   nsAppShellInit,
   311   nsWidgetWindowsModuleDtor
   312 };
   314 NSMODULE_DEFN(nsWidgetModule) = &kWidgetModule;

mercurial