NS_IMETHODIMP ScrollbarActivity::HandleEvent(nsIDOMEvent* aEvent) { if (!mDisplayOnMouseMove && !mIsActive) return NS_OK; nsAutoString type; aEvent->GetType(type); if (type.EqualsLiteral("mousemove")) { // Mouse motions anywhere in the scrollable frame should keep the // scrollbars visible. ActivityOccurred(); return NS_OK; } nsCOMPtr<nsIDOMEventTarget> target; aEvent->GetOriginalTarget(getter_AddRefs(target)); nsCOMPtr<nsIContent> targetContent = do_QueryInterface(target); HandleEventForScrollbar(type, targetContent, GetHorizontalScrollbar(), &mHScrollbarHovered); HandleEventForScrollbar(type, targetContent, GetVerticalScrollbar(), &mVScrollbarHovered); return NS_OK; }
void ScrollbarActivity::HoveredScrollbar(nsIContent* aScrollbar) { SetBooleanAttribute(GetHorizontalScrollbar(), nsGkAtoms::hover, false); SetBooleanAttribute(GetVerticalScrollbar(), nsGkAtoms::hover, false); SetBooleanAttribute(aScrollbar, nsGkAtoms::hover, true); }
void ScrollbarActivity::StartListeningForScrollbarEvents() { if (mListeningForScrollbarEvents) return; mHorizontalScrollbar = do_QueryInterface(GetHorizontalScrollbar()); mVerticalScrollbar = do_QueryInterface(GetVerticalScrollbar()); AddScrollbarEventListeners(mHorizontalScrollbar); AddScrollbarEventListeners(mVerticalScrollbar); mListeningForScrollbarEvents = true; }
void ScrollbarActivity::SetIsActive(bool aNewActive) { if (mIsActive == aNewActive) return; mIsActive = aNewActive; if (!mIsActive) { // Clear sticky scrollbar hover status. HoveredScrollbar(nullptr); } SetBooleanAttribute(GetHorizontalScrollbar(), nsGkAtoms::active, mIsActive); SetBooleanAttribute(GetVerticalScrollbar(), nsGkAtoms::active, mIsActive); }
bool ScrollbarActivity::UpdateOpacity(TimeStamp aTime) { double progress = (aTime - mFadeBeginTime) / FadeDuration(); double opacity = 1.0 - std::max(0.0, std::min(1.0, progress)); // 'this' may be getting destroyed during SetOpacityOnElement calls. nsWeakFrame weakFrame((do_QueryFrame(mScrollableFrame))); SetOpacityOnElement(GetHorizontalScrollbar(), opacity); if (!weakFrame.IsAlive()) { return false; } SetOpacityOnElement(GetVerticalScrollbar(), opacity); if (!weakFrame.IsAlive()) { return false; } return true; }
bool ScrollbarActivity::SetIsFading(bool aNewFading) { if (mIsFading == aNewFading) return true; mIsFading = aNewFading; if (!mIsFading) { mFadeBeginTime = TimeStamp(); // 'this' may be getting destroyed during UnsetOpacityOnElement calls. nsWeakFrame weakFrame((do_QueryFrame(mScrollableFrame))); UnsetOpacityOnElement(GetHorizontalScrollbar()); if (!weakFrame.IsAlive()) { return false; } UnsetOpacityOnElement(GetVerticalScrollbar()); if (!weakFrame.IsAlive()) { return false; } } return true; }
bool ScrollbarActivity::UpdateOpacity(TimeStamp aTime) { // Avoid division by zero if mScrollbarFadeDuration is zero, just jump // to the end of the fade animation double progress = mScrollbarFadeDuration ? ((aTime - mFadeBeginTime) / FadeDuration()) : 1.0; double opacity = 1.0 - std::max(0.0, std::min(1.0, progress)); // 'this' may be getting destroyed during SetOpacityOnElement calls. nsWeakFrame weakFrame((do_QueryFrame(mScrollableFrame))); SetOpacityOnElement(GetHorizontalScrollbar(), opacity); if (!weakFrame.IsAlive()) { return false; } SetOpacityOnElement(GetVerticalScrollbar(), opacity); if (!weakFrame.IsAlive()) { return false; } return true; }