void APZCCallbackHelper::UpdateSubFrame(nsIContent* aContent, FrameMetrics& aMetrics) { // Precondition checks MOZ_ASSERT(aContent); if (aMetrics.mScrollId == FrameMetrics::NULL_SCROLL_ID) { return; } nsCOMPtr<nsIDOMWindowUtils> utils = GetDOMWindowUtils(aContent); if (!utils) { return; } // We currently do not support zooming arbitrary subframes. They can only // be scrolled, so here we only have to set the scroll position and displayport. nsIScrollableFrame* sf = nsLayoutUtils::FindScrollableFrameFor(aMetrics.mScrollId); CSSPoint actualScrollOffset = ScrollFrameTo(sf, aMetrics.mScrollOffset); nsCOMPtr<nsIDOMElement> element = do_QueryInterface(aContent); if (element) { MaybeAlignAndClampDisplayPort(aMetrics, actualScrollOffset); utils->SetDisplayPortForElement(aMetrics.mDisplayPort.x, aMetrics.mDisplayPort.y, aMetrics.mDisplayPort.width, aMetrics.mDisplayPort.height, element); } aMetrics.mScrollOffset = actualScrollOffset; }
already_AddRefed<nsIDOMWindowUtils> APZCCallbackHelper::GetDOMWindowUtils(const nsIContent* aContent) { nsCOMPtr<nsIDOMWindowUtils> utils; nsIDocument* doc = aContent->GetCurrentDoc(); if (doc) { utils = GetDOMWindowUtils(doc); } return utils.forget(); }
bool APZCCallbackHelper::GetScrollIdentifiers(const nsIContent* aContent, uint32_t* aPresShellIdOut, FrameMetrics::ViewID* aViewIdOut) { if (!aContent || !nsLayoutUtils::FindIDFor(aContent, aViewIdOut)) { return false; } nsCOMPtr<nsIDOMWindowUtils> utils = GetDOMWindowUtils(aContent); return utils && (utils->GetPresShellId(aPresShellIdOut) == NS_OK); }
void APZCCallbackHelper::UpdateSubFrame(nsIContent* aContent, FrameMetrics& aMetrics) { // Precondition checks MOZ_ASSERT(aContent); MOZ_ASSERT(aMetrics.GetUseDisplayPortMargins()); if (aMetrics.GetScrollId() == FrameMetrics::NULL_SCROLL_ID) { return; } nsCOMPtr<nsIDOMWindowUtils> utils = GetDOMWindowUtils(aContent); if (!utils) { return; } // We currently do not support zooming arbitrary subframes. They can only // be scrolled, so here we only have to set the scroll position and displayport. nsIScrollableFrame* sf = nsLayoutUtils::FindScrollableFrameFor(aMetrics.GetScrollId()); bool scrollUpdated = false; CSSPoint actualScrollOffset = ScrollFrameTo(sf, aMetrics.GetScrollOffset(), scrollUpdated); nsCOMPtr<nsIDOMElement> element = do_QueryInterface(aContent); if (element) { if (scrollUpdated) { AdjustDisplayPortForScrollDelta(aMetrics, actualScrollOffset); } else { RecenterDisplayPort(aMetrics); } gfx::IntSize alignment = gfxPrefs::LayersTilesEnabled() ? gfx::IntSize(gfxPrefs::LayersTileWidth(), gfxPrefs::LayersTileHeight()) : gfx::IntSize(0, 0); LayerMargin margins = aMetrics.GetDisplayPortMargins(); utils->SetDisplayPortMarginsForElement(margins.left, margins.top, margins.right, margins.bottom, alignment.width, alignment.height, element, 0); CSSRect baseCSS = aMetrics.CalculateCompositedRectInCssPixels(); nsRect base(baseCSS.x * nsPresContext::AppUnitsPerCSSPixel(), baseCSS.y * nsPresContext::AppUnitsPerCSSPixel(), baseCSS.width * nsPresContext::AppUnitsPerCSSPixel(), baseCSS.height * nsPresContext::AppUnitsPerCSSPixel()); nsLayoutUtils::SetDisplayPortBaseIfNotSet(aContent, base); } aMetrics.SetScrollOffset(actualScrollOffset); }
void APZCCallbackHelper::UpdateSubFrame(nsIContent* aContent, FrameMetrics& aMetrics) { // Precondition checks MOZ_ASSERT(aContent); MOZ_ASSERT(aMetrics.GetUseDisplayPortMargins()); // We don't currently support zooming for subframes, so nothing extra // needs to be done beyond the tasks common to this and UpdateRootFrame. ScrollFrame(aContent, aMetrics); if (nsCOMPtr<nsIDOMWindowUtils> utils = GetDOMWindowUtils(aContent)) { SetDisplayPortMargins(utils, aContent, aMetrics); } }
void APZCCallbackHandler::RequestContentRepaint(const FrameMetrics& aFrameMetrics) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aFrameMetrics.GetScrollId() != FrameMetrics::NULL_SCROLL_ID); if (aFrameMetrics.GetIsRoot()) { nsIDOMWindowUtils* utils = GetDOMWindowUtils(); if (utils && APZCCallbackHelper::HasValidPresShellId(utils, aFrameMetrics)) { FrameMetrics metrics = aFrameMetrics; APZCCallbackHelper::UpdateRootFrame(utils, metrics); } } else { // aFrameMetrics.mIsRoot is false, so we are trying to update a subframe. // This requires special handling. nsCOMPtr<nsIContent> content = nsLayoutUtils::FindContentFor(aFrameMetrics.GetScrollId()); if (content) { FrameMetrics newSubFrameMetrics(aFrameMetrics); APZCCallbackHelper::UpdateSubFrame(content, newSubFrameMetrics); } } }