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;