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:
Kartikaya Gupta 2016-01-12 11:53:55 -05:00
Родитель f27556ce7d
Коммит 6e12e0b31f
3 изменённых файлов: 50 добавлений и 5 удалений

Просмотреть файл

@ -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)