mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
ab81798c2c
- Bug 1157400 - Port Chromium WinXP wifi scanner to gecko. r=mcmanus (9b635017e1) - Bug 1244586 part 1 - Add KeyframeEffect constructor in dom/webidl/KeyframeEffect.webidl. r=smaug,birtles (1290148ebd) - Bug 1226047 - Add AnimationEffectTiming interface in dom/webidl/AnimationEffectTiming.webidl. r=smaug,birtles (ba10fa4231) - Bug 1244586 part 2 - Remove entry in testing/web-platform/meta/web-animations/animatable/animate.html.ini. r=birtles (fc517234a3) - Bug 1244586 part 3 - Remove unnecessary spaces in dom/base/Element.cpp. r=smaug (206e3e39e9) - Bug 1244328 - Merge the functionality of DOMSettableTokenList into DOMTokenList and make everything that used to refer to DOMSettableTokenList refer to DOMTokenList instead. r=bzbarsky (d9da9d650b) - Bug 1249278 - Expose KeyframeEffect interface only if nsDocument::IsWebAnimationsEnabled is true. r=smaug (f2ebb43d75) - Bug 1245075 patch 1 - Remove assertion, since it can fire during frame destruction. r=dholbert (cb2821f507) - Bug 1237467 part 1 - No longer mark element as needing an animation restyle if we go to restyle it and it no longer has an effect set; r=heycam (dd0de52287) - Bug 1237467 part 2 - Clear mProgressOnLastCompose when the effect is no longer relevant; r=heycam (d4249517e6) - Bug 1237467 part 3 - Add debug methods to determine if an EffectSet is currently being enumerated; r=heycam (41b68593c0) - Bug 1237467 part 4 - Delete the EffectSet when it becomes empty; r=heycam (8db9a40774) - Bug 1226091 - Use MayHaveAnimations flag for animations on pseudo elements too; r=smaug (b60bbdd9d4) - Bug 1245075 patch 2 - Fix EffectSet::GetEffectSet(nsIFrame*) and EffectCompositor::GetAnimationElementAndPseudoForFrame to only return effects when the frame is the style frame for its content. r=birtles (82fd23f632) - Bug 1235112 - Move animation style rule processors to EffectCompositor; r=heycam (3b88ffab44) - Bug 1247865 - Fix assertion to handle restyling of a table::after. r=birtles (62d4c12d58) - Bug 1244049 - Part 1: Define scoped enum for CSSPseudoElement type. r=dbaron (b2232f2c37) - Bug 1240479 - pass values for mReversePortion and mStartForReversingTestin through constructor. r=heycam (2b914ea48f) - Bug 1244049 - Part 2: Replace nsCSSPseudoElements::Type with CSSPseudoElementType. r=dbaron (a7c2d48b62) - Bug 1244250 - r=mats (c7b5cde4ba) - Bug 1234095 - Rework sorting to handle to script-generated animations; r=heycam (44e9463b5a) - Bug 888190. Implement case-insensitive attribute value selectors from Selectors 4. r=dbaron (43ede42ade) - Bug 1240956 part 1 - [css-grid] Swap the order of column/row values for 'grid', 'grid-template' and 'grid-gap' properties. Block axis values now always comes first; inline axis values second. r=dholbert (73a78b5ee0) - Bug 1240956 part 3 - [css-grid] Add a ParseGridTrackList convenience method. r=dholbert (8b62273ccc) - Bug 1234409: Give percentage positions to the dummy transparent color-stops that we use to pad CSS -webkit-gradient() expressions. r=heycam (f9da14276b) - Bug 1231485 part 1 - Fix text-emphasis shorthand with style part unspecified being computed incorrectly. r=dbaron (3a9ea936fa) - Bug 1231485 part 2 - Add NeutralChange hint to nsStyleText::MaxDifference(). r=dbaron (db3adc0250) - Bug 1231485 part 3 - Fix style tests for text-emphasis properties. r=dbaron (d17ec991fd) - Bug 1231485 part 4 - Enable layout.css.text-emphasis.enabled pref. r=dbaron (9362cd4ef8) - Bug 1157400 - Part1: port chromium XP wifi scanning code. r=mcmanus (bfe8b3f758) - Bug 1240646 - Do not unthrottle animations if RestyleType::Throttled is specified. r=bbirtles (664255ff76) - Bug 1240228 - Don't update an effect's timing when tweaking its animation's hold time; r=heycam (e1cb11e54c) - Bug 1246046 part 1 - Get the animation rule in nsStyleSet::GetContext even if there are no CSS animations; r=heycam (4032b461cf) - Bug 1246046 part 2 - Add reftest for style updating for script-generated animations; r=heycam (a134bc98b0) - Bug 1241378 - Stop uselessly getting the style set from nsStyleSet::ResolveAnonymousBoxStyle. r=dholbert (4ad16c9a17) - Bug 1230639 - Propagate the namespace ID to AttributeRuleProcessorData on attribute changes. r=dbaron (77a383158b)
299 lines
9.8 KiB
C++
299 lines
9.8 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* 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/. */
|
|
|
|
#include "nsMeterFrame.h"
|
|
|
|
#include "nsIContent.h"
|
|
#include "nsPresContext.h"
|
|
#include "nsGkAtoms.h"
|
|
#include "nsNameSpaceManager.h"
|
|
#include "nsIDocument.h"
|
|
#include "nsIPresShell.h"
|
|
#include "nsNodeInfoManager.h"
|
|
#include "nsContentCreatorFunctions.h"
|
|
#include "nsContentUtils.h"
|
|
#include "nsFormControlFrame.h"
|
|
#include "nsFontMetrics.h"
|
|
#include "mozilla/dom/Element.h"
|
|
#include "mozilla/dom/HTMLMeterElement.h"
|
|
#include "nsContentList.h"
|
|
#include "nsCSSPseudoElements.h"
|
|
#include "nsStyleSet.h"
|
|
#include "nsThemeConstants.h"
|
|
#include <algorithm>
|
|
|
|
using namespace mozilla;
|
|
using mozilla::dom::Element;
|
|
using mozilla::dom::HTMLMeterElement;
|
|
|
|
nsIFrame*
|
|
NS_NewMeterFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
|
|
{
|
|
return new (aPresShell) nsMeterFrame(aContext);
|
|
}
|
|
|
|
NS_IMPL_FRAMEARENA_HELPERS(nsMeterFrame)
|
|
|
|
nsMeterFrame::nsMeterFrame(nsStyleContext* aContext)
|
|
: nsContainerFrame(aContext)
|
|
, mBarDiv(nullptr)
|
|
{
|
|
}
|
|
|
|
nsMeterFrame::~nsMeterFrame()
|
|
{
|
|
}
|
|
|
|
void
|
|
nsMeterFrame::DestroyFrom(nsIFrame* aDestructRoot)
|
|
{
|
|
NS_ASSERTION(!GetPrevContinuation(),
|
|
"nsMeterFrame should not have continuations; if it does we "
|
|
"need to call RegUnregAccessKey only for the first.");
|
|
nsFormControlFrame::RegUnRegAccessKey(static_cast<nsIFrame*>(this), false);
|
|
nsContentUtils::DestroyAnonymousContent(&mBarDiv);
|
|
nsContainerFrame::DestroyFrom(aDestructRoot);
|
|
}
|
|
|
|
nsIAtom*
|
|
nsMeterFrame::GetType() const
|
|
{
|
|
return nsGkAtoms::meterFrame;
|
|
}
|
|
|
|
nsresult
|
|
nsMeterFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
|
|
{
|
|
// Get the NodeInfoManager and tag necessary to create the meter bar div.
|
|
nsCOMPtr<nsIDocument> doc = mContent->GetComposedDoc();
|
|
|
|
// Create the div.
|
|
mBarDiv = doc->CreateHTMLElement(nsGkAtoms::div);
|
|
|
|
// Associate ::-moz-meter-bar pseudo-element to the anonymous child.
|
|
CSSPseudoElementType pseudoType = CSSPseudoElementType::mozMeterBar;
|
|
RefPtr<nsStyleContext> newStyleContext = PresContext()->StyleSet()->
|
|
ResolvePseudoElementStyle(mContent->AsElement(), pseudoType,
|
|
StyleContext(), mBarDiv->AsElement());
|
|
|
|
if (!aElements.AppendElement(ContentInfo(mBarDiv, newStyleContext))) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
nsMeterFrame::AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements,
|
|
uint32_t aFilter)
|
|
{
|
|
if (mBarDiv) {
|
|
aElements.AppendElement(mBarDiv);
|
|
}
|
|
}
|
|
|
|
NS_QUERYFRAME_HEAD(nsMeterFrame)
|
|
NS_QUERYFRAME_ENTRY(nsMeterFrame)
|
|
NS_QUERYFRAME_ENTRY(nsIAnonymousContentCreator)
|
|
NS_QUERYFRAME_TAIL_INHERITING(nsContainerFrame)
|
|
|
|
|
|
void
|
|
nsMeterFrame::Reflow(nsPresContext* aPresContext,
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus)
|
|
{
|
|
MarkInReflow();
|
|
DO_GLOBAL_REFLOW_COUNT("nsMeterFrame");
|
|
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
|
|
|
|
NS_ASSERTION(mBarDiv, "Meter bar div must exist!");
|
|
NS_ASSERTION(!GetPrevContinuation(),
|
|
"nsMeterFrame should not have continuations; if it does we "
|
|
"need to call RegUnregAccessKey only for the first.");
|
|
|
|
if (mState & NS_FRAME_FIRST_REFLOW) {
|
|
nsFormControlFrame::RegUnRegAccessKey(this, true);
|
|
}
|
|
|
|
nsIFrame* barFrame = mBarDiv->GetPrimaryFrame();
|
|
NS_ASSERTION(barFrame, "The meter frame should have a child with a frame!");
|
|
|
|
ReflowBarFrame(barFrame, aPresContext, aReflowState, aStatus);
|
|
|
|
aDesiredSize.SetSize(aReflowState.GetWritingMode(),
|
|
aReflowState.ComputedSizeWithBorderPadding());
|
|
|
|
aDesiredSize.SetOverflowAreasToDesiredBounds();
|
|
ConsiderChildOverflow(aDesiredSize.mOverflowAreas, barFrame);
|
|
FinishAndStoreOverflow(&aDesiredSize);
|
|
|
|
aStatus = NS_FRAME_COMPLETE;
|
|
|
|
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
|
}
|
|
|
|
void
|
|
nsMeterFrame::ReflowBarFrame(nsIFrame* aBarFrame,
|
|
nsPresContext* aPresContext,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus)
|
|
{
|
|
bool vertical = ResolvedOrientationIsVertical();
|
|
WritingMode wm = aBarFrame->GetWritingMode();
|
|
LogicalSize availSize = aReflowState.ComputedSize(wm);
|
|
availSize.BSize(wm) = NS_UNCONSTRAINEDSIZE;
|
|
nsHTMLReflowState reflowState(aPresContext, aReflowState,
|
|
aBarFrame, availSize);
|
|
nscoord size = vertical ? aReflowState.ComputedHeight()
|
|
: aReflowState.ComputedWidth();
|
|
nscoord xoffset = aReflowState.ComputedPhysicalBorderPadding().left;
|
|
nscoord yoffset = aReflowState.ComputedPhysicalBorderPadding().top;
|
|
|
|
// NOTE: Introduce a new function getPosition in the content part ?
|
|
HTMLMeterElement* meterElement = static_cast<HTMLMeterElement*>(mContent);
|
|
|
|
double max = meterElement->Max();
|
|
double min = meterElement->Min();
|
|
double value = meterElement->Value();
|
|
|
|
double position = max - min;
|
|
position = position != 0 ? (value - min) / position : 1;
|
|
|
|
size = NSToCoordRound(size * position);
|
|
|
|
if (!vertical && (wm.IsVertical() ? wm.IsVerticalRL() : !wm.IsBidiLTR())) {
|
|
xoffset += aReflowState.ComputedWidth() - size;
|
|
}
|
|
|
|
// The bar position is *always* constrained.
|
|
if (vertical) {
|
|
// We want the bar to begin at the bottom.
|
|
yoffset += aReflowState.ComputedHeight() - size;
|
|
|
|
size -= reflowState.ComputedPhysicalMargin().TopBottom() +
|
|
reflowState.ComputedPhysicalBorderPadding().TopBottom();
|
|
size = std::max(size, 0);
|
|
reflowState.SetComputedHeight(size);
|
|
} else {
|
|
size -= reflowState.ComputedPhysicalMargin().LeftRight() +
|
|
reflowState.ComputedPhysicalBorderPadding().LeftRight();
|
|
size = std::max(size, 0);
|
|
reflowState.SetComputedWidth(size);
|
|
}
|
|
|
|
xoffset += reflowState.ComputedPhysicalMargin().left;
|
|
yoffset += reflowState.ComputedPhysicalMargin().top;
|
|
|
|
nsHTMLReflowMetrics barDesiredSize(reflowState);
|
|
ReflowChild(aBarFrame, aPresContext, barDesiredSize, reflowState, xoffset,
|
|
yoffset, 0, aStatus);
|
|
FinishReflowChild(aBarFrame, aPresContext, barDesiredSize, &reflowState,
|
|
xoffset, yoffset, 0);
|
|
}
|
|
|
|
nsresult
|
|
nsMeterFrame::AttributeChanged(int32_t aNameSpaceID,
|
|
nsIAtom* aAttribute,
|
|
int32_t aModType)
|
|
{
|
|
NS_ASSERTION(mBarDiv, "Meter bar div must exist!");
|
|
|
|
if (aNameSpaceID == kNameSpaceID_None &&
|
|
(aAttribute == nsGkAtoms::value ||
|
|
aAttribute == nsGkAtoms::max ||
|
|
aAttribute == nsGkAtoms::min )) {
|
|
nsIFrame* barFrame = mBarDiv->GetPrimaryFrame();
|
|
NS_ASSERTION(barFrame, "The meter frame should have a child with a frame!");
|
|
PresContext()->PresShell()->FrameNeedsReflow(barFrame,
|
|
nsIPresShell::eResize,
|
|
NS_FRAME_IS_DIRTY);
|
|
InvalidateFrame();
|
|
}
|
|
|
|
return nsContainerFrame::AttributeChanged(aNameSpaceID, aAttribute,
|
|
aModType);
|
|
}
|
|
|
|
LogicalSize
|
|
nsMeterFrame::ComputeAutoSize(nsRenderingContext *aRenderingContext,
|
|
WritingMode aWM,
|
|
const LogicalSize& aCBSize,
|
|
nscoord aAvailableISize,
|
|
const LogicalSize& aMargin,
|
|
const LogicalSize& aBorder,
|
|
const LogicalSize& aPadding,
|
|
bool aShrinkWrap)
|
|
{
|
|
RefPtr<nsFontMetrics> fontMet;
|
|
NS_ENSURE_SUCCESS(nsLayoutUtils::GetFontMetricsForFrame(this,
|
|
getter_AddRefs(fontMet)),
|
|
LogicalSize(aWM));
|
|
|
|
const WritingMode wm = GetWritingMode();
|
|
LogicalSize autoSize(wm);
|
|
autoSize.BSize(wm) = autoSize.ISize(wm) = fontMet->Font().size; // 1em
|
|
|
|
if (ResolvedOrientationIsVertical() == wm.IsVertical()) {
|
|
autoSize.ISize(wm) *= 5; // 5em
|
|
} else {
|
|
autoSize.BSize(wm) *= 5; // 5em
|
|
}
|
|
|
|
return autoSize.ConvertTo(aWM, wm);
|
|
}
|
|
|
|
nscoord
|
|
nsMeterFrame::GetMinISize(nsRenderingContext *aRenderingContext)
|
|
{
|
|
RefPtr<nsFontMetrics> fontMet;
|
|
NS_ENSURE_SUCCESS(
|
|
nsLayoutUtils::GetFontMetricsForFrame(this, getter_AddRefs(fontMet)), 0);
|
|
|
|
nscoord minISize = fontMet->Font().size; // 1em
|
|
|
|
if (ResolvedOrientationIsVertical() == GetWritingMode().IsVertical()) {
|
|
// The orientation is inline
|
|
minISize *= 5; // 5em
|
|
}
|
|
|
|
return minISize;
|
|
}
|
|
|
|
nscoord
|
|
nsMeterFrame::GetPrefISize(nsRenderingContext *aRenderingContext)
|
|
{
|
|
return GetMinISize(aRenderingContext);
|
|
}
|
|
|
|
bool
|
|
nsMeterFrame::ShouldUseNativeStyle() const
|
|
{
|
|
nsIFrame* barFrame = mBarDiv->GetPrimaryFrame();
|
|
|
|
// 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()->mAppearance == NS_THEME_METERBAR &&
|
|
!PresContext()->HasAuthorSpecifiedRules(this,
|
|
NS_AUTHOR_SPECIFIED_BORDER | NS_AUTHOR_SPECIFIED_BACKGROUND) &&
|
|
barFrame &&
|
|
barFrame->StyleDisplay()->mAppearance == NS_THEME_METERBAR_CHUNK &&
|
|
!PresContext()->HasAuthorSpecifiedRules(barFrame,
|
|
NS_AUTHOR_SPECIFIED_BORDER | NS_AUTHOR_SPECIFIED_BACKGROUND);
|
|
}
|
|
|
|
Element*
|
|
nsMeterFrame::GetPseudoElement(CSSPseudoElementType aType)
|
|
{
|
|
if (aType == CSSPseudoElementType::mozMeterBar) {
|
|
return mBarDiv;
|
|
}
|
|
|
|
return nsContainerFrame::GetPseudoElement(aType);
|
|
}
|