/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
void nsProgressFrame::Destroy(DestroyContext& aContext) {
NS_ASSERTION(!GetPrevContinuation(), "nsProgressFrame should not have continuations; if it does we " "need to call RegUnregAccessKey only for the first.");
aContext.AddAnonymousContent(mBarDiv.forget());
nsContainerFrame::Destroy(aContext);
}
nsresult nsProgressFrame::CreateAnonymousContent(
nsTArray<ContentInfo>& aElements) { // Create the progress bar div.
nsCOMPtr<Document> doc = mContent->GetComposedDoc();
mBarDiv = doc->CreateHTMLElement(nsGkAtoms::div);
// Associate ::-moz-progress-bar pseudo-element to the anonymous child. if (StaticPrefs::layout_css_modern_range_pseudos_enabled()) { // TODO(emilio): Create also a slider-track pseudo-element.
mBarDiv->SetPseudoElementType(PseudoStyleType::sliderFill);
} else {
mBarDiv->SetPseudoElementType(PseudoStyleType::mozProgressBar);
}
// XXX(Bug 1631371) Check if this should use a fallible operation as it // pretended earlier, or change the return type to void.
aElements.AppendElement(mBarDiv);
NS_ASSERTION(mBarDiv, "Progress bar div must exist!");
NS_ASSERTION(
PrincipalChildList().GetLength() == 1 &&
PrincipalChildList().FirstChild() == mBarDiv->GetPrimaryFrame(), "unexpected child frames");
NS_ASSERTION(!GetPrevContinuation(), "nsProgressFrame should not have continuations; if it does we " "need to call RegUnregAccessKey only for the first.");
double position = static_cast<HTMLProgressElement*>(GetContent())->Position();
// Force the bar's size to match the current progress. // When indeterminate, the progress' size will be 100%. if (position >= 0.0) {
size *= position;
}
// The bar size is fixed in these cases: // - the progress position is determined: the bar size is fixed according // to it's value. // - the progress position is indeterminate and the bar appearance should be // shown as native: the bar size is forced to 100%. // Otherwise (when the progress is indeterminate and the bar appearance isn't // native), the bar size isn't fixed and can be set by the author. if (position != -1 || ShouldUseNativeStyle()) { if (vertical) { // We want the bar to begin at the bottom.
yoffset += parentPhysicalSize.Height() - size;
size -= reflowInput.ComputedPhysicalMargin().TopBottom() +
reflowInput.ComputedPhysicalBorderPadding().TopBottom();
size = std::max(size, 0);
reflowInput.SetComputedHeight(size);
} else {
size -= reflowInput.ComputedPhysicalMargin().LeftRight() +
reflowInput.ComputedPhysicalBorderPadding().LeftRight();
size = std::max(size, 0);
reflowInput.SetComputedWidth(size);
}
} elseif (vertical) { // For vertical progress bars, we need to position the bar specifically when // the width isn't constrained (position == -1 and !ShouldUseNativeStyle()) // because parentPhysiscalSize.Height() - size == 0. // FIXME(emilio): This assumes that the bar's height is constrained, which // seems like a wrong assumption?
yoffset += parentPhysicalSize.Height() - reflowInput.ComputedHeight();
}
nsresult nsProgressFrame::AttributeChanged(int32_t aNameSpaceID,
nsAtom* aAttribute,
int32_t aModType) {
NS_ASSERTION(mBarDiv, "Progress bar div must exist!");
if (aNameSpaceID == kNameSpaceID_None &&
(aAttribute == nsGkAtoms::value || aAttribute == nsGkAtoms::max)) { auto presShell = PresShell(); for (auto childFrame : PrincipalChildList()) {
presShell->FrameNeedsReflow(childFrame, IntrinsicDirty::None,
NS_FRAME_IS_DIRTY);
}
InvalidateFrame();
}
// Use the native style if these conditions are satisfied: // - both frames use the native appearance; // - neither frame has author specified rules setting the border or the // background. return StyleDisplay()->EffectiveAppearance() ==
StyleAppearance::ProgressBar &&
!Style()->HasAuthorSpecifiedBorderOrBackground() && barFrame &&
barFrame->StyleDisplay()->EffectiveAppearance() ==
StyleAppearance::Progresschunk &&
!barFrame->Style()->HasAuthorSpecifiedBorderOrBackground();
}
¤ Dauer der Verarbeitung: 0.35 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.