mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-27 04:05:32 +00:00
![Kartikaya Gupta](/assets/img/avatar_default.png)
Synthetic mouseevents generated from touch gestures are dispatched asynchronously from the touch events. This means that the nsAutoRollup that the widget puts on the stack during the dispatching of the touch events is no longer in scope when we get around to firing the mouse events. As a result, the mouse events can end up reopening rollups that got closed by the touch events and that shouldn't be reopened. We fix this by stashing the rollup that was in scope while the touch events were being dispatched, and make sure we keep that in scope for the synthetic mouse events. MozReview-Commit-ID: HjteKHfAqvD --HG-- extra : rebase_source : 46217b1ba610ef193963ccab454a6f584af61a2b
56 lines
1.3 KiB
C++
56 lines
1.3 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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 "mozilla/widget/nsAutoRollup.h"
|
|
|
|
namespace mozilla {
|
|
namespace widget {
|
|
|
|
/*static*/ uint32_t nsAutoRollup::sCount = 0;
|
|
/*static*/ StaticRefPtr<nsIContent> nsAutoRollup::sLastRollup;
|
|
|
|
nsAutoRollup::nsAutoRollup()
|
|
{
|
|
// remember if sLastRollup was null, and only clear it upon destruction
|
|
// if so. This prevents recursive usage of nsAutoRollup from clearing
|
|
// sLastRollup when it shouldn't.
|
|
mWasClear = !sLastRollup;
|
|
sCount++;
|
|
}
|
|
|
|
nsAutoRollup::nsAutoRollup(nsIContent* aRollup)
|
|
{
|
|
MOZ_ASSERT(!sLastRollup);
|
|
mWasClear = true;
|
|
sCount++;
|
|
SetLastRollup(aRollup);
|
|
}
|
|
|
|
nsAutoRollup::~nsAutoRollup()
|
|
{
|
|
if (sLastRollup && mWasClear) {
|
|
sLastRollup = nullptr;
|
|
}
|
|
sCount--;
|
|
}
|
|
|
|
/*static*/ void
|
|
nsAutoRollup::SetLastRollup(nsIContent* aLastRollup)
|
|
{
|
|
// There must be at least one nsAutoRollup on the stack.
|
|
MOZ_ASSERT(sCount);
|
|
|
|
sLastRollup = aLastRollup;
|
|
}
|
|
|
|
/*static*/ nsIContent*
|
|
nsAutoRollup::GetLastRollup()
|
|
{
|
|
return sLastRollup.get();
|
|
}
|
|
|
|
} // namespace widget
|
|
} // namespace mozilla
|