From 07f1042cd886085d644e304544e316d4ca69f774 Mon Sep 17 00:00:00 2001 From: Ben Turner Date: Wed, 3 Feb 2010 13:09:55 -0800 Subject: [PATCH] Bug 542821 - 'Process startup event gets dropped on the floor by deferred messaging'. r=jimm. --- ipc/glue/WindowsMessageLoop.cpp | 42 +++++++++++++++++++++++++++++++++ ipc/glue/WindowsMessageLoop.h | 14 +++++++++++ 2 files changed, 56 insertions(+) diff --git a/ipc/glue/WindowsMessageLoop.cpp b/ipc/glue/WindowsMessageLoop.cpp index 6aef2cf68b24..e748fb62cf8b 100644 --- a/ipc/glue/WindowsMessageLoop.cpp +++ b/ipc/glue/WindowsMessageLoop.cpp @@ -245,6 +245,12 @@ ProcessOrDeferMessage(HWND hwnd, break; } + case WM_COPYDATA: { + deferred = new DeferredCopyDataMessage(hwnd, uMsg, wParam, lParam); + res = TRUE; + break; + } + // Messages that are safe to pass to DefWindowProc go here. case WM_GETICON: case WM_GETMINMAXINFO: @@ -725,3 +731,39 @@ DeferredWindowPosMessage::Run() windowPos.y, windowPos.cx, windowPos.cy, windowPos.flags); NS_ASSERTION(ret, "SetWindowPos failed!"); } + +DeferredCopyDataMessage::DeferredCopyDataMessage(HWND aHWnd, + UINT aMessage, + WPARAM aWParam, + LPARAM aLParam) +: DeferredSendMessage(aHWnd, aMessage, aWParam, aLParam) +{ + NS_ASSERTION(IsWindow(reinterpret_cast(aWParam)), "Bad window!"); + + COPYDATASTRUCT* source = reinterpret_cast(aLParam); + NS_ASSERTION(source, "Should never be null!"); + + copyData.dwData = source->dwData; + copyData.cbData = source->cbData; + + if (source->cbData) { + copyData.lpData = malloc(source->cbData); + if (copyData.lpData) { + memcpy(copyData.lpData, source->lpData, source->cbData); + } + else { + NS_ERROR("Out of memory?!"); + copyData.cbData = 0; + } + } + else { + copyData.lpData = NULL; + } + + lParam = reinterpret_cast(©Data); +} + +DeferredCopyDataMessage::~DeferredCopyDataMessage() +{ + free(copyData.lpData); +} diff --git a/ipc/glue/WindowsMessageLoop.h b/ipc/glue/WindowsMessageLoop.h index 2c2e1c7ffc24..d2b0904ad295 100644 --- a/ipc/glue/WindowsMessageLoop.h +++ b/ipc/glue/WindowsMessageLoop.h @@ -154,6 +154,20 @@ private: WINDOWPOS windowPos; }; +// This class duplicates a data buffer for a WM_COPYDATA message. +class DeferredCopyDataMessage : public DeferredSendMessage +{ +public: + DeferredCopyDataMessage(HWND aHWnd, + UINT aMessage, + WPARAM aWParam, + LPARAM aLParam); + + ~DeferredCopyDataMessage(); +private: + COPYDATASTRUCT copyData; +}; + } /* namespace windows */ } /* namespace ipc */ } /* namespace mozilla */