author | Boris Zbarsky <bzbarsky@mit.edu> |
Tue, 10 Jan 2012 00:23:29 -0500 | |
changeset 84078 | 2a35bcdd7c1ea8b55e9052c4aa30bb79f8cc916a |
parent 84077 | 01d69766026d4a1ed6b56b5b8148a630ea6dde6a |
child 84079 | 71eb0a8829cf659a19c5a434b1e687e9cef5b540 |
push id | 4724 |
push user | bzbarsky@mozilla.com |
push date | Tue, 10 Jan 2012 05:30:59 +0000 |
treeherder | mozilla-inbound@71eb0a8829cf [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc |
bugs | 716793 |
milestone | 12.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
layout/base/nsPresShell.cpp | file | annotate | diff | comparison | revisions | |
layout/base/nsPresShell.h | file | annotate | diff | comparison | revisions |
--- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -5250,17 +5250,18 @@ void PresShell::SynthesizeMouseMove(bool if (mMouseLocation == nsPoint(NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE)) return; if (!mSynthMouseMoveEvent.IsPending()) { nsRefPtr<nsSynthMouseMoveEvent> ev = new nsSynthMouseMoveEvent(this, aFromScroll); - if (NS_FAILED(NS_DispatchToCurrentThread(ev))) { + if (!GetPresContext()->RefreshDriver()->AddRefreshObserver(ev, + Flush_Display)) { NS_WARNING("failed to dispatch nsSynthMouseMoveEvent"); return; } mSynthMouseMoveEvent = ev; } }
--- a/layout/base/nsPresShell.h +++ b/layout/base/nsPresShell.h @@ -847,27 +847,38 @@ private: // the mouse pointer may have changed without the mouse moving (eg scrolling, // change to the document contents). // It is set only on a presshell for a root document, this value represents // the last observed location of the mouse relative to that root document. It // is set to (NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE) if the mouse isn't // over our window or there is no last observed mouse location for some // reason. nsPoint mMouseLocation; - class nsSynthMouseMoveEvent : public nsRunnable { + class nsSynthMouseMoveEvent : public nsARefreshObserver { public: nsSynthMouseMoveEvent(PresShell* aPresShell, bool aFromScroll) : mPresShell(aPresShell), mFromScroll(aFromScroll) { NS_ASSERTION(mPresShell, "null parameter"); } - void Revoke() { mPresShell = nsnull; } - NS_IMETHOD Run() { + ~nsSynthMouseMoveEvent() { + Revoke(); + } + + NS_INLINE_DECL_REFCOUNTING(nsSynthMouseMoveEvent) + + void Revoke() { + if (mPresShell) { + mPresShell->GetPresContext()->RefreshDriver()-> + RemoveRefreshObserver(this, Flush_Display); + mPresShell = nsnull; + } + } + virtual void WillRefresh(mozilla::TimeStamp aTime) { if (mPresShell) mPresShell->ProcessSynthMouseMoveEvent(mFromScroll); - return NS_OK; } private: PresShell* mPresShell; bool mFromScroll; }; nsRevocableEventPtr<nsSynthMouseMoveEvent> mSynthMouseMoveEvent; void ProcessSynthMouseMoveEvent(bool aFromScroll);