diff --git a/dom/plugins/PluginInstanceChild.cpp b/dom/plugins/PluginInstanceChild.cpp index 7d5c0dfedf59..ec01ce6eda53 100644 --- a/dom/plugins/PluginInstanceChild.cpp +++ b/dom/plugins/PluginInstanceChild.cpp @@ -59,6 +59,9 @@ using namespace mozilla::plugins; #elif defined(MOZ_WIDGET_QT) #include #elif defined(OS_WIN) +#ifndef WM_MOUSEHWHEEL +#define WM_MOUSEHWHEEL 0x020E +#endif #include "nsWindowsDllInterceptor.h" @@ -1058,6 +1061,21 @@ PluginInstanceChild::PluginWindowProc(HWND hWnd, if (message == WM_MOUSEACTIVATE) self->CallPluginGotFocus(); + // Prevent lockups due to plugins making rpc calls when the parent + // is making a synchronous SendMessage call to the child window. Add + // more messages as needed. + if ((InSendMessageEx(NULL)&(ISMEX_REPLIED|ISMEX_SEND)) == ISMEX_SEND) { + switch(message) { + case WM_KILLFOCUS: + case WM_MOUSEHWHEEL: + case WM_MOUSEWHEEL: + case WM_HSCROLL: + case WM_VSCROLL: + ReplyMessage(0); + break; + } + } + if (message == WM_USER+1 && (self->mQuirks & PluginInstanceChild::QUIRK_FLASH_THROTTLE_WMUSER_EVENTS)) { self->FlashThrottleMessage(hWnd, message, wParam, lParam, true); diff --git a/dom/plugins/PluginModuleChild.cpp b/dom/plugins/PluginModuleChild.cpp index 080aec15336b..d4cc5d692044 100644 --- a/dom/plugins/PluginModuleChild.cpp +++ b/dom/plugins/PluginModuleChild.cpp @@ -66,9 +66,6 @@ using namespace mozilla::plugins; #if defined(XP_WIN) -#ifndef WM_MOUSEHWHEEL -#define WM_MOUSEHWHEEL 0x020E -#endif const PRUnichar * kFlashFullscreenClass = L"ShockwaveFlashFullScreen"; #endif @@ -1903,60 +1900,16 @@ PluginModuleChild::CallWindowProcHook(int nCode, WPARAM wParam, LPARAM lParam) if (nCode >= 0 && (InSendMessageEx(NULL)&(ISMEX_REPLIED|ISMEX_SEND)) == ISMEX_SEND) { CWPSTRUCT* pCwp = reinterpret_cast(lParam); - switch(pCwp->message) { - // Sync messages we can reply to: - case WM_SETFOCUS: - case WM_MOUSEHWHEEL: - case WM_MOUSEWHEEL: - case WM_HSCROLL: - case WM_VSCROLL: - case WM_CONTEXTMENU: - case WM_IME_SETCONTEXT: - case WM_WINDOWPOSCHANGED: - ReplyMessage(0); - break; - case WM_KILLFOCUS: - { - // Fix for flash fullscreen window loosing focus. On single - // core systems, sync killfocus events need to be handled - // after the flash fullscreen window procedure processes this - // message, otherwise fullscreen focus will not work correctly. - PRUnichar szClass[26]; - if (GetClassNameW(pCwp->hwnd, szClass, - sizeof(szClass)/sizeof(PRUnichar)) && - !wcscmp(szClass, kFlashFullscreenClass)) { - gDelayFlashFocusReplyUntilEval = true; - } - else { - ReplyMessage(0); - } - } - break; - // Sync message that can't be handled: - case WM_WINDOWPOSCHANGING: - case WM_DESTROY: - case WM_PAINT: - break; - // Everything else: - default: { -#ifdef DEBUG - nsCAutoString log("Child plugin module received untrapped "); - log.AppendLiteral("synchronous message for window. msg="); - char szTmp[40]; - sprintf(szTmp, "0x%06X", pCwp->message); - log.Append(szTmp); - log.AppendLiteral(" hwnd="); - sprintf(szTmp, "0x%08X", pCwp->hwnd); - log.Append(szTmp); - PRUnichar className[256] = { 0 }; - if (GetClassNameW(pCwp->hwnd, className, - sizeof(className)/sizeof(PRUnichar)) > 0) { - log.AppendLiteral(" class='"); - log.Append(NS_ConvertUTF16toUTF8((PRUnichar*)className)); - log.AppendLiteral("'"); - } - NS_WARNING(log.get()); -#endif + if (pCwp->message == WM_KILLFOCUS) { + // Fix for flash fullscreen window loosing focus. On single + // core systems, sync killfocus events need to be handled + // after the flash fullscreen window procedure processes this + // message, otherwise fullscreen focus will not work correctly. + PRUnichar szClass[26]; + if (GetClassNameW(pCwp->hwnd, szClass, + sizeof(szClass)/sizeof(PRUnichar)) && + !wcscmp(szClass, kFlashFullscreenClass)) { + gDelayFlashFocusReplyUntilEval = true; } } }