Bug 1334257: Assure that TIPMessageHandler hooks may not be instantiated more than once; r?jimm
MozReview-Commit-ID: LiDQ9yUzGTK
--- a/widget/windows/nsWindow.cpp
+++ b/widget/windows/nsWindow.cpp
@@ -409,21 +409,24 @@ public:
{
if (mHook) {
::UnhookWindowsHookEx(mHook);
}
}
static void Initialize()
{
- MOZ_ASSERT(!sInstance);
if (!IsWin8OrLater()) {
return;
}
+ if (sInstance) {
+ return;
+ }
+
sInstance = new TIPMessageHandler();
ClearOnShutdown(&sInstance);
}
static bool IsA11yBlocked()
{
if (!sInstance) {
return false;
@@ -447,31 +450,32 @@ private:
mMessages[4] = ::RegisterWindowMessage(L"ProgrammabilityCaretVisibility");
mMessages[5] = ::RegisterWindowMessage(L"CaretTrackingUpdateIPHidden");
mMessages[6] = ::RegisterWindowMessage(L"CaretTrackingUpdateIPInfo");
mHook = ::SetWindowsHookEx(WH_GETMESSAGE, &TIPHook, nullptr,
::GetCurrentThreadId());
MOZ_ASSERT(mHook);
- if (!IsWin10OrLater()) {
+ if (!IsWin10OrLater() && !sProcessCaretEventsStub) {
// tiptsf loads when STA COM is first initialized, so it should be present
sTipTsfInterceptor.Init("tiptsf.dll");
DebugOnly<bool> ok = sTipTsfInterceptor.AddHook("ProcessCaretEvents",
reinterpret_cast<intptr_t>(&ProcessCaretEventsHook),
(void**) &sProcessCaretEventsStub);
MOZ_ASSERT(ok);
}
- MOZ_ASSERT(!sSendMessageTimeoutWStub);
- sUser32Intercept.Init("user32.dll");
- DebugOnly<bool> hooked = sUser32Intercept.AddHook("SendMessageTimeoutW",
- reinterpret_cast<intptr_t>(&SendMessageTimeoutWHook),
- (void**) &sSendMessageTimeoutWStub);
- MOZ_ASSERT(hooked);
+ if (!sSendMessageTimeoutWStub) {
+ sUser32Intercept.Init("user32.dll");
+ DebugOnly<bool> hooked = sUser32Intercept.AddHook("SendMessageTimeoutW",
+ reinterpret_cast<intptr_t>(&SendMessageTimeoutWHook),
+ (void**) &sSendMessageTimeoutWStub);
+ MOZ_ASSERT(hooked);
+ }
}
class MOZ_RAII A11yInstantiationBlocker
{
public:
A11yInstantiationBlocker()
{
if (!TIPMessageHandler::sInstance) {