forked from mirrors/gecko-dev
		
	 dfcb2919c3
			
		
	
	
		dfcb2919c3
		
	
	
	
	
		
			
			Backed out changeset 700e3d729c8d (bug 1805802) Backed out changeset c2ddb25d9523 (bug 1805802)
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim:expandtab:shiftwidth=2:tabstop=2:
 | |
|  */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "CmdLineAndEnvUtils.h"
 | |
| #include "nsWinRemoteServer.h"
 | |
| #include "RemoteUtils.h"
 | |
| #include "nsCOMPtr.h"
 | |
| #include "nsXPCOM.h"
 | |
| #include "nsPIDOMWindow.h"
 | |
| #include "nsIWindowMediator.h"
 | |
| #include "nsIBaseWindow.h"
 | |
| #include "nsIWidget.h"
 | |
| #include "nsICommandLineRunner.h"
 | |
| #include "nsICommandLine.h"
 | |
| #include "nsCommandLine.h"
 | |
| #include "nsIDocShell.h"
 | |
| #include "WinRemoteMessage.h"
 | |
| 
 | |
| HWND hwndForDOMWindow(mozIDOMWindowProxy* window) {
 | |
|   if (!window) {
 | |
|     return 0;
 | |
|   }
 | |
|   nsCOMPtr<nsPIDOMWindowOuter> pidomwindow = nsPIDOMWindowOuter::From(window);
 | |
| 
 | |
|   nsCOMPtr<nsIBaseWindow> ppBaseWindow =
 | |
|       do_QueryInterface(pidomwindow->GetDocShell());
 | |
|   if (!ppBaseWindow) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   nsCOMPtr<nsIWidget> ppWidget;
 | |
|   ppBaseWindow->GetMainWidget(getter_AddRefs(ppWidget));
 | |
| 
 | |
|   return (HWND)(ppWidget->GetNativeData(NS_NATIVE_WIDGET));
 | |
| }
 | |
| 
 | |
| static nsresult GetMostRecentWindow(mozIDOMWindowProxy** aWindow) {
 | |
|   nsresult rv;
 | |
|   nsCOMPtr<nsIWindowMediator> med(
 | |
|       do_GetService(NS_WINDOWMEDIATOR_CONTRACTID, &rv));
 | |
|   if (NS_FAILED(rv)) return rv;
 | |
| 
 | |
|   if (med) return med->GetMostRecentWindow(nullptr, aWindow);
 | |
| 
 | |
|   return NS_ERROR_FAILURE;
 | |
| }
 | |
| 
 | |
| LRESULT CALLBACK WindowProc(HWND msgWindow, UINT msg, WPARAM wp, LPARAM lp) {
 | |
|   if (msg == WM_COPYDATA) {
 | |
|     WinRemoteMessageReceiver receiver;
 | |
|     if (NS_SUCCEEDED(receiver.Parse(reinterpret_cast<COPYDATASTRUCT*>(lp)))) {
 | |
|       receiver.CommandLineRunner()->Run();
 | |
|     } else {
 | |
|       NS_ERROR("Error initializing command line.");
 | |
|     }
 | |
| 
 | |
|     // Get current window and return its window handle.
 | |
|     nsCOMPtr<mozIDOMWindowProxy> win;
 | |
|     GetMostRecentWindow(getter_AddRefs(win));
 | |
|     return win ? (LRESULT)hwndForDOMWindow(win) : 0;
 | |
|   }
 | |
|   return DefWindowProcW(msgWindow, msg, wp, lp);
 | |
| }
 | |
| 
 | |
| nsresult nsWinRemoteServer::Startup(const char* aAppName,
 | |
|                                     const char* aProfileName) {
 | |
|   nsString className;
 | |
|   BuildClassName(aAppName, aProfileName, className);
 | |
| 
 | |
|   WNDCLASSW classStruct = {0,                 // style
 | |
|                            &WindowProc,       // lpfnWndProc
 | |
|                            0,                 // cbClsExtra
 | |
|                            0,                 // cbWndExtra
 | |
|                            0,                 // hInstance
 | |
|                            0,                 // hIcon
 | |
|                            0,                 // hCursor
 | |
|                            0,                 // hbrBackground
 | |
|                            0,                 // lpszMenuName
 | |
|                            className.get()};  // lpszClassName
 | |
| 
 | |
|   // Register the window class.
 | |
|   NS_ENSURE_TRUE(::RegisterClassW(&classStruct), NS_ERROR_FAILURE);
 | |
| 
 | |
|   // Create the window.
 | |
|   mHandle = ::CreateWindowW(className.get(),
 | |
|                             0,           // title
 | |
|                             WS_CAPTION,  // style
 | |
|                             0, 0, 0, 0,  // x, y, cx, cy
 | |
|                             0,           // parent
 | |
|                             0,           // menu
 | |
|                             0,           // instance
 | |
|                             0);          // create struct
 | |
| 
 | |
|   return mHandle ? NS_OK : NS_ERROR_FAILURE;
 | |
| }
 | |
| 
 | |
| void nsWinRemoteServer::Shutdown() {
 | |
|   DestroyWindow(mHandle);
 | |
|   mHandle = nullptr;
 | |
| }
 |