зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1234838 - Update the windows backwards time skew fix code to use a PostMessage rather than a gecko NS_DispatchToMainThread. r=karlt
--HG-- extra : commitid : 9yGf6w0Xo6k
This commit is contained in:
Родитель
f27556ce7d
Коммит
6e12e0b31f
|
@ -260,6 +260,11 @@ namespace mozilla {
|
|||
|
||||
class CurrentWindowsTimeGetter {
|
||||
public:
|
||||
CurrentWindowsTimeGetter(HWND aWnd)
|
||||
: mWnd(aWnd)
|
||||
{
|
||||
}
|
||||
|
||||
DWORD GetCurrentTime() const
|
||||
{
|
||||
return ::GetTickCount();
|
||||
|
@ -267,12 +272,40 @@ public:
|
|||
|
||||
void GetTimeAsyncForPossibleBackwardsSkew(const TimeStamp& aNow)
|
||||
{
|
||||
NS_DispatchToMainThread(NS_NewRunnableFunction([aNow]() {
|
||||
TimeConverter().CompensateForBackwardsSkew(::GetMessageTime(), aNow);
|
||||
}));
|
||||
DWORD currentTime = GetCurrentTime();
|
||||
if (sBackwardsSkewStamp && currentTime == sLastPostTime) {
|
||||
// There's already one inflight with this timestamp. Don't
|
||||
// send a duplicate.
|
||||
return;
|
||||
}
|
||||
sBackwardsSkewStamp = Some(aNow);
|
||||
sLastPostTime = currentTime;
|
||||
static_assert(sizeof(WPARAM) >= sizeof(DWORD), "Can't fit a DWORD in a WPARAM");
|
||||
::PostMessage(mWnd, MOZ_WM_SKEWFIX, sLastPostTime, 0);
|
||||
}
|
||||
|
||||
static bool GetAndClearBackwardsSkewStamp(DWORD aPostTime, TimeStamp* aOutSkewStamp)
|
||||
{
|
||||
if (aPostTime != sLastPostTime) {
|
||||
// The SKEWFIX message is stale; we've sent a new one since then.
|
||||
// Ignore this one.
|
||||
return false;
|
||||
}
|
||||
MOZ_ASSERT(sBackwardsSkewStamp);
|
||||
*aOutSkewStamp = sBackwardsSkewStamp.value();
|
||||
sBackwardsSkewStamp = Nothing();
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
static Maybe<TimeStamp> sBackwardsSkewStamp;
|
||||
static DWORD sLastPostTime;
|
||||
HWND mWnd;
|
||||
};
|
||||
|
||||
Maybe<TimeStamp> CurrentWindowsTimeGetter::sBackwardsSkewStamp;
|
||||
DWORD CurrentWindowsTimeGetter::sLastPostTime = 0;
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
/**************************************************************
|
||||
|
@ -5704,6 +5737,15 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
|
|||
}
|
||||
break;
|
||||
|
||||
case MOZ_WM_SKEWFIX:
|
||||
{
|
||||
TimeStamp skewStamp;
|
||||
if (CurrentWindowsTimeGetter::GetAndClearBackwardsSkewStamp(wParam, &skewStamp)) {
|
||||
TimeConverter().CompensateForBackwardsSkew(::GetMessageTime(), skewStamp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
if (msg == nsAppShell::GetTaskbarButtonCreatedMessage()) {
|
||||
|
@ -5906,7 +5948,7 @@ nsWindow::ClientMarginHitTestPoint(int32_t mx, int32_t my)
|
|||
TimeStamp
|
||||
nsWindow::GetMessageTimeStamp(LONG aEventTime)
|
||||
{
|
||||
CurrentWindowsTimeGetter getCurrentTime;
|
||||
CurrentWindowsTimeGetter getCurrentTime(mWnd);
|
||||
return TimeConverter().GetTimeStampFromSystemTime(aEventTime,
|
||||
getCurrentTime);
|
||||
}
|
||||
|
|
|
@ -390,7 +390,7 @@ protected:
|
|||
static bool ConvertStatus(nsEventStatus aStatus);
|
||||
static void PostSleepWakeNotification(const bool aIsSleepMode);
|
||||
int32_t ClientMarginHitTestPoint(int32_t mx, int32_t my);
|
||||
static TimeStamp GetMessageTimeStamp(LONG aEventTime);
|
||||
TimeStamp GetMessageTimeStamp(LONG aEventTime);
|
||||
static void UpdateFirstEventTime(DWORD aEventTime);
|
||||
|
||||
/**
|
||||
|
|
|
@ -39,6 +39,9 @@
|
|||
// If TSFTextStore needs to notify TSF/TIP of layout change later, this
|
||||
// message is posted.
|
||||
#define MOZ_WM_NOTIY_TSF_OF_LAYOUT_CHANGE (WM_APP+0x0315)
|
||||
// Internal message used in correcting backwards clock skew
|
||||
#define MOZ_WM_SKEWFIX (WM_APP+0x0316)
|
||||
|
||||
// Internal message for ensuring the file picker is visible on multi monitor
|
||||
// systems, and when the screen resolution changes.
|
||||
#define MOZ_WM_ENSUREVISIBLE (WM_APP+0x374F)
|
||||
|
|
Загрузка…
Ссылка в новой задаче