зеркало из https://github.com/mozilla/pjs.git
Bug 475535 - don't go through PaintBackgroundWithSC to draw non-native radio buttons and checkboxes; remove special UA pseudo-elements for styling these. r+sr=roc
This commit is contained in:
Родитель
3303c4cc93
Коммит
4908551014
|
@ -49,20 +49,25 @@
|
||||||
#include "nsIDOMNSHTMLInputElement.h"
|
#include "nsIDOMNSHTMLInputElement.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PaintCheckMark(nsIRenderingContext& aRenderingContext,
|
PaintCheckMark(nsIFrame* aFrame,
|
||||||
const nsRect& aRect)
|
nsIRenderingContext* aCtx,
|
||||||
|
const nsRect& aDirtyRect,
|
||||||
|
nsPoint aPt)
|
||||||
{
|
{
|
||||||
|
nsRect rect(aPt, aFrame->GetSize());
|
||||||
|
rect.Deflate(aFrame->GetUsedBorderAndPadding());
|
||||||
|
|
||||||
// Points come from the coordinates on a 7X7 unit box centered at 0,0
|
// Points come from the coordinates on a 7X7 unit box centered at 0,0
|
||||||
const PRInt32 checkPolygonX[] = { -3, -1, 3, 3, -1, -3 };
|
const PRInt32 checkPolygonX[] = { -3, -1, 3, 3, -1, -3 };
|
||||||
const PRInt32 checkPolygonY[] = { -1, 1, -3, -1, 3, 1 };
|
const PRInt32 checkPolygonY[] = { -1, 1, -3, -1, 3, 1 };
|
||||||
const PRInt32 checkNumPoints = sizeof(checkPolygonX) / sizeof(PRInt32);
|
const PRInt32 checkNumPoints = sizeof(checkPolygonX) / sizeof(PRInt32);
|
||||||
const PRInt32 checkSize = 9; // This is value is determined by adding 2
|
const PRInt32 checkSize = 9; // 2 units of padding on either side
|
||||||
// units to pad the 7x7 unit checkmark
|
// of the 7x7 unit checkmark
|
||||||
|
|
||||||
// Scale the checkmark based on the smallest dimension
|
// Scale the checkmark based on the smallest dimension
|
||||||
nscoord paintScale = PR_MIN(aRect.width, aRect.height) / checkSize;
|
nscoord paintScale = PR_MIN(rect.width, rect.height) / checkSize;
|
||||||
nsPoint paintCenter(aRect.x + aRect.width / 2,
|
nsPoint paintCenter(rect.x + rect.width / 2,
|
||||||
aRect.y + aRect.height / 2);
|
rect.y + rect.height / 2);
|
||||||
|
|
||||||
nsPoint paintPolygon[checkNumPoints];
|
nsPoint paintPolygon[checkNumPoints];
|
||||||
// Convert checkmark for screen rendering
|
// Convert checkmark for screen rendering
|
||||||
|
@ -72,24 +77,30 @@ PaintCheckMark(nsIRenderingContext& aRenderingContext,
|
||||||
checkPolygonY[polyIndex] * paintScale);
|
checkPolygonY[polyIndex] * paintScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
aRenderingContext.FillPolygon(paintPolygon, checkNumPoints);
|
aCtx->SetColor(aFrame->GetStyleColor()->mColor);
|
||||||
|
aCtx->FillPolygon(paintPolygon, checkNumPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PaintIndeterminateMark(nsIRenderingContext& aRenderingContext,
|
PaintIndeterminateMark(nsIFrame* aFrame,
|
||||||
const nsRect& aRect)
|
nsIRenderingContext* aCtx,
|
||||||
|
const nsRect& aDirtyRect,
|
||||||
|
nsPoint aPt)
|
||||||
{
|
{
|
||||||
// Drawing a thin horizontal line in the middle of the rect.
|
nsRect rect(aPt, aFrame->GetSize());
|
||||||
nsRect fillRect = aRect;
|
rect.Deflate(aFrame->GetUsedBorderAndPadding());
|
||||||
fillRect.height /= 4;
|
|
||||||
fillRect.y += (aRect.height - fillRect.height) / 2;
|
|
||||||
|
|
||||||
aRenderingContext.FillRect(fillRect);
|
rect.y += (rect.height - rect.height/4) / 2;
|
||||||
|
rect.height /= 4;
|
||||||
|
|
||||||
|
aCtx->SetColor(aFrame->GetStyleColor()->mColor);
|
||||||
|
aCtx->FillRect(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
nsIFrame*
|
nsIFrame*
|
||||||
NS_NewGfxCheckboxControlFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
|
NS_NewGfxCheckboxControlFrame(nsIPresShell* aPresShell,
|
||||||
|
nsStyleContext* aContext)
|
||||||
{
|
{
|
||||||
return new (aPresShell) nsGfxCheckboxControlFrame(aContext);
|
return new (aPresShell) nsGfxCheckboxControlFrame(aContext);
|
||||||
}
|
}
|
||||||
|
@ -111,63 +122,22 @@ NS_QUERYFRAME_HEAD(nsGfxCheckboxControlFrame)
|
||||||
NS_QUERYFRAME_ENTRY(nsICheckboxControlFrame)
|
NS_QUERYFRAME_ENTRY(nsICheckboxControlFrame)
|
||||||
NS_QUERYFRAME_TAIL_INHERITING(nsFormControlFrame)
|
NS_QUERYFRAME_TAIL_INHERITING(nsFormControlFrame)
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsGfxCheckboxControlFrame::Init(nsIContent* aContent,
|
|
||||||
nsIFrame* aParent,
|
|
||||||
nsIFrame* aPrevInFlow)
|
|
||||||
{
|
|
||||||
nsresult rv = nsFormControlFrame::Init(aContent, aParent, aPrevInFlow);
|
|
||||||
if (NS_SUCCEEDED(rv)) {
|
|
||||||
mCheckButtonFaceStyle =
|
|
||||||
PresContext()->PresShell()->StyleSet()->
|
|
||||||
ResolvePseudoStyleFor(aContent, nsCSSAnonBoxes::check,
|
|
||||||
GetStyleContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ACCESSIBILITY
|
#ifdef ACCESSIBILITY
|
||||||
NS_IMETHODIMP nsGfxCheckboxControlFrame::GetAccessible(nsIAccessible** aAccessible)
|
NS_IMETHODIMP
|
||||||
|
nsGfxCheckboxControlFrame::GetAccessible(nsIAccessible** aAccessible)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIAccessibilityService> accService = do_GetService("@mozilla.org/accessibilityService;1");
|
nsCOMPtr<nsIAccessibilityService> accService
|
||||||
|
= do_GetService("@mozilla.org/accessibilityService;1");
|
||||||
|
|
||||||
if (accService) {
|
if (accService) {
|
||||||
return accService->CreateHTMLCheckboxAccessible(static_cast<nsIFrame*>(this), aAccessible);
|
return accService->CreateHTMLCheckboxAccessible(
|
||||||
|
static_cast<nsIFrame*>(this), aAccessible);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
nsStyleContext*
|
|
||||||
nsGfxCheckboxControlFrame::GetAdditionalStyleContext(PRInt32 aIndex) const
|
|
||||||
{
|
|
||||||
switch (aIndex) {
|
|
||||||
case NS_GFX_CHECKBOX_CONTROL_FRAME_FACE_CONTEXT_INDEX:
|
|
||||||
return mCheckButtonFaceStyle;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return nsnull;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
void
|
|
||||||
nsGfxCheckboxControlFrame::SetAdditionalStyleContext(PRInt32 aIndex,
|
|
||||||
nsStyleContext* aStyleContext)
|
|
||||||
{
|
|
||||||
switch (aIndex) {
|
|
||||||
case NS_GFX_CHECKBOX_CONTROL_FRAME_FACE_CONTEXT_INDEX:
|
|
||||||
mCheckButtonFaceStyle = aStyleContext;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsGfxCheckboxControlFrame::OnChecked(nsPresContext* aPresContext,
|
nsGfxCheckboxControlFrame::OnChecked(nsPresContext* aPresContext,
|
||||||
|
@ -177,64 +147,14 @@ nsGfxCheckboxControlFrame::OnChecked(nsPresContext* aPresContext,
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PaintCheckMarkFromStyle(nsIFrame* aFrame,
|
|
||||||
nsIRenderingContext* aCtx, const nsRect& aDirtyRect, nsPoint aPt) {
|
|
||||||
static_cast<nsGfxCheckboxControlFrame*>(aFrame)
|
|
||||||
->PaintCheckBoxFromStyle(*aCtx, aPt, aDirtyRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
class nsDisplayCheckMark : public nsDisplayItem {
|
|
||||||
public:
|
|
||||||
nsDisplayCheckMark(nsGfxCheckboxControlFrame* aFrame)
|
|
||||||
: nsDisplayItem(aFrame) {
|
|
||||||
MOZ_COUNT_CTOR(nsDisplayCheckMark);
|
|
||||||
}
|
|
||||||
#ifdef NS_BUILD_REFCNT_LOGGING
|
|
||||||
virtual ~nsDisplayCheckMark() {
|
|
||||||
MOZ_COUNT_DTOR(nsDisplayCheckMark);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual void Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx,
|
|
||||||
const nsRect& aDirtyRect);
|
|
||||||
NS_DISPLAY_DECL_NAME("CheckMark")
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
nsDisplayCheckMark::Paint(nsDisplayListBuilder* aBuilder,
|
|
||||||
nsIRenderingContext* aCtx, const nsRect& aDirtyRect) {
|
|
||||||
static_cast<nsGfxCheckboxControlFrame*>(mFrame)->
|
|
||||||
PaintCheckBox(*aCtx, aBuilder->ToReferenceFrame(mFrame), aDirtyRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------
|
|
||||||
void
|
|
||||||
nsGfxCheckboxControlFrame::PaintCheckBox(nsIRenderingContext& aRenderingContext,
|
|
||||||
nsPoint aPt,
|
|
||||||
const nsRect& aDirtyRect)
|
|
||||||
{
|
|
||||||
// REVIEW: moved the mAppearance test out so we avoid constructing
|
|
||||||
// a display item if it's not needed
|
|
||||||
nsRect checkRect(aPt, mRect.Size());
|
|
||||||
checkRect.Deflate(GetUsedBorderAndPadding());
|
|
||||||
|
|
||||||
const nsStyleColor* color = GetStyleColor();
|
|
||||||
aRenderingContext.SetColor(color->mColor);
|
|
||||||
|
|
||||||
if (IsIndeterminate())
|
|
||||||
PaintIndeterminateMark(aRenderingContext, checkRect);
|
|
||||||
else
|
|
||||||
PaintCheckMark(aRenderingContext, checkRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
const nsDisplayListSet& aLists)
|
const nsDisplayListSet& aLists)
|
||||||
{
|
{
|
||||||
nsresult rv = nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
|
nsresult rv = nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect,
|
||||||
|
aLists);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
// Get current checked state through content model.
|
// Get current checked state through content model.
|
||||||
|
@ -244,45 +164,11 @@ nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
||||||
if (IsThemed())
|
if (IsThemed())
|
||||||
return NS_OK; // No need to paint the checkmark. The theme will do it.
|
return NS_OK; // No need to paint the checkmark. The theme will do it.
|
||||||
|
|
||||||
// Paint the checkmark
|
return aLists.Content()->AppendNewToTop(new (aBuilder)
|
||||||
if (mCheckButtonFaceStyle) {
|
nsDisplayGeneric(this,
|
||||||
// This code actually works now; not sure how useful it'll be
|
IsIndeterminate()
|
||||||
// (The purpose is to allow the UA stylesheet to substitute its own
|
? PaintIndeterminateMark : PaintCheckMark,
|
||||||
// checkmark for the default one)
|
"CheckedCheckbox"));
|
||||||
// XXXbz maybe we should just remove this, together with the
|
|
||||||
// attendant complexity
|
|
||||||
const nsStyleBackground* myBackground = mCheckButtonFaceStyle->GetStyleBackground();
|
|
||||||
if (!myBackground->IsTransparent())
|
|
||||||
return aLists.Content()->AppendNewToTop(new (aBuilder)
|
|
||||||
nsDisplayGeneric(this, PaintCheckMarkFromStyle, "CheckMarkFromStyle"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return aLists.Content()->AppendNewToTop(new (aBuilder) nsDisplayCheckMark(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsGfxCheckboxControlFrame::PaintCheckBoxFromStyle(
|
|
||||||
nsIRenderingContext& aRenderingContext, nsPoint aPt, const nsRect& aDirtyRect) {
|
|
||||||
const nsStylePosition* myPosition = mCheckButtonFaceStyle->GetStylePosition();
|
|
||||||
const nsStyleBorder* myBorder = mCheckButtonFaceStyle->GetStyleBorder();
|
|
||||||
const nsStyleBackground* myBackground = mCheckButtonFaceStyle->GetStyleBackground();
|
|
||||||
|
|
||||||
NS_ASSERTION(myPosition->mWidth.GetUnit() == eStyleUnit_Coord &&
|
|
||||||
myPosition->mHeight.GetUnit() == eStyleUnit_Coord,
|
|
||||||
"styles for :-moz-checkbox are incorrect or author-accessible");
|
|
||||||
nscoord width = myPosition->mWidth.GetCoordValue();
|
|
||||||
nscoord height = myPosition->mHeight.GetCoordValue();
|
|
||||||
// Position the button centered within the control's rectangle.
|
|
||||||
nscoord x = (mRect.width - width) / 2;
|
|
||||||
nscoord y = (mRect.height - height) / 2;
|
|
||||||
nsRect rect(aPt.x + x, aPt.y + y, width, height);
|
|
||||||
|
|
||||||
nsCSSRendering::PaintBackgroundWithSC(PresContext(), aRenderingContext,
|
|
||||||
this, aDirtyRect, rect, *myBackground,
|
|
||||||
*myBorder, PR_FALSE);
|
|
||||||
nsCSSRendering::PaintBorder(PresContext(), aRenderingContext, this,
|
|
||||||
aDirtyRect, rect, *myBorder,
|
|
||||||
mCheckButtonFaceStyle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
|
|
|
@ -44,10 +44,6 @@
|
||||||
class nsIAccessible;
|
class nsIAccessible;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define NS_GFX_CHECKBOX_CONTROL_FRAME_FACE_CONTEXT_INDEX 0 // for additional style contexts
|
|
||||||
#define NS_GFX_CHECKBOX_CONTROL_FRAME_LAST_CONTEXT_INDEX 0
|
|
||||||
|
|
||||||
class nsGfxCheckboxControlFrame : public nsFormControlFrame,
|
class nsGfxCheckboxControlFrame : public nsFormControlFrame,
|
||||||
public nsICheckboxControlFrame
|
public nsICheckboxControlFrame
|
||||||
{
|
{
|
||||||
|
@ -69,32 +65,15 @@ public:
|
||||||
NS_IMETHOD GetAccessible(nsIAccessible** aAccessible);
|
NS_IMETHOD GetAccessible(nsIAccessible** aAccessible);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//nsICheckboxControlFrame methods
|
//nsICheckboxControlFrame methods
|
||||||
NS_IMETHOD OnChecked(nsPresContext* aPresContext, PRBool aChecked);
|
NS_IMETHOD OnChecked(nsPresContext* aPresContext, PRBool aChecked);
|
||||||
|
|
||||||
virtual nsStyleContext* GetAdditionalStyleContext(PRInt32 aIndex) const;
|
|
||||||
virtual void SetAdditionalStyleContext(PRInt32 aIndex,
|
|
||||||
nsStyleContext* aStyleContext);
|
|
||||||
|
|
||||||
NS_DECL_QUERYFRAME
|
NS_DECL_QUERYFRAME
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIContent* aContent,
|
|
||||||
nsIFrame* aParent,
|
|
||||||
nsIFrame* asPrevInFlow);
|
|
||||||
|
|
||||||
void PaintCheckBox(nsIRenderingContext& aRenderingContext,
|
|
||||||
nsPoint aPt, const nsRect& aDirtyRect);
|
|
||||||
|
|
||||||
void PaintCheckBoxFromStyle(nsIRenderingContext& aRenderingContext,
|
|
||||||
nsPoint aPt, const nsRect& aDirtyRect);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
PRBool IsChecked();
|
PRBool IsChecked();
|
||||||
PRBool IsIndeterminate();
|
PRBool IsIndeterminate();
|
||||||
|
|
||||||
nsRefPtr<nsStyleContext> mCheckButtonFaceStyle;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -66,29 +66,16 @@ NS_QUERYFRAME_HEAD(nsGfxRadioControlFrame)
|
||||||
NS_QUERYFRAME_ENTRY(nsIRadioControlFrame)
|
NS_QUERYFRAME_ENTRY(nsIRadioControlFrame)
|
||||||
NS_QUERYFRAME_TAIL_INHERITING(nsFormControlFrame)
|
NS_QUERYFRAME_TAIL_INHERITING(nsFormControlFrame)
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsGfxRadioControlFrame::Init(nsIContent* aContent,
|
|
||||||
nsIFrame* aParent,
|
|
||||||
nsIFrame* aPrevInFlow)
|
|
||||||
{
|
|
||||||
nsresult rv = nsFormControlFrame::Init(aContent, aParent, aPrevInFlow);
|
|
||||||
if (NS_SUCCEEDED(rv)) {
|
|
||||||
mRadioButtonFaceStyle =
|
|
||||||
PresContext()->PresShell()->StyleSet()->
|
|
||||||
ResolvePseudoStyleFor(aContent, nsCSSAnonBoxes::radio,
|
|
||||||
GetStyleContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ACCESSIBILITY
|
#ifdef ACCESSIBILITY
|
||||||
NS_IMETHODIMP nsGfxRadioControlFrame::GetAccessible(nsIAccessible** aAccessible)
|
NS_IMETHODIMP
|
||||||
|
nsGfxRadioControlFrame::GetAccessible(nsIAccessible** aAccessible)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIAccessibilityService> accService = do_GetService("@mozilla.org/accessibilityService;1");
|
nsCOMPtr<nsIAccessibilityService> accService
|
||||||
|
= do_GetService("@mozilla.org/accessibilityService;1");
|
||||||
|
|
||||||
if (accService) {
|
if (accService) {
|
||||||
return accService->CreateHTMLRadioButtonAccessible(static_cast<nsIFrame*>(this), aAccessible);
|
return accService->CreateHTMLRadioButtonAccessible(
|
||||||
|
static_cast<nsIFrame*>(this), aAccessible);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
@ -96,120 +83,48 @@ NS_IMETHODIMP nsGfxRadioControlFrame::GetAccessible(nsIAccessible** aAccessible)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
nsStyleContext*
|
// Draw the dot for a non-native radio button in the checked state.
|
||||||
nsGfxRadioControlFrame::GetAdditionalStyleContext(PRInt32 aIndex) const
|
static void
|
||||||
|
PaintCheckedRadioButton(nsIFrame* aFrame,
|
||||||
|
nsIRenderingContext* aCtx,
|
||||||
|
const nsRect& aDirtyRect,
|
||||||
|
nsPoint aPt)
|
||||||
{
|
{
|
||||||
switch (aIndex) {
|
// The dot is an ellipse 2px on all sides smaller than the content-box,
|
||||||
case NS_GFX_RADIO_CONTROL_FRAME_FACE_CONTEXT_INDEX:
|
// drawn in the foreground color.
|
||||||
return mRadioButtonFaceStyle;
|
nsRect rect(aPt, aFrame->GetSize());
|
||||||
break;
|
rect.Deflate(aFrame->GetUsedBorderAndPadding());
|
||||||
default:
|
rect.Deflate(nsPresContext::CSSPixelsToAppUnits(2),
|
||||||
return nsnull;
|
nsPresContext::CSSPixelsToAppUnits(2));
|
||||||
}
|
|
||||||
|
aCtx->SetColor(aFrame->GetStyleColor()->mColor);
|
||||||
|
aCtx->FillEllipse(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
void
|
|
||||||
nsGfxRadioControlFrame::SetAdditionalStyleContext(PRInt32 aIndex,
|
|
||||||
nsStyleContext* aStyleContext)
|
|
||||||
{
|
|
||||||
switch (aIndex) {
|
|
||||||
case NS_GFX_RADIO_CONTROL_FRAME_FACE_CONTEXT_INDEX:
|
|
||||||
mRadioButtonFaceStyle = aStyleContext;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
void
|
|
||||||
nsGfxRadioControlFrame::PaintRadioButtonFromStyle(
|
|
||||||
nsIRenderingContext& aRenderingContext, nsPoint aPt, const nsRect& aDirtyRect)
|
|
||||||
{
|
|
||||||
const nsStyleBorder* myBorder = mRadioButtonFaceStyle->GetStyleBorder();
|
|
||||||
// Paint the button for the radio button using CSS background rendering code
|
|
||||||
const nsStyleBackground* myColor = mRadioButtonFaceStyle->GetStyleBackground();
|
|
||||||
const nsStyleColor* color = mRadioButtonFaceStyle->GetStyleColor();
|
|
||||||
const nsStylePosition* myPosition = mRadioButtonFaceStyle->GetStylePosition();
|
|
||||||
|
|
||||||
NS_ASSERTION(myPosition->mWidth.GetUnit() == eStyleUnit_Coord &&
|
|
||||||
myPosition->mHeight.GetUnit() == eStyleUnit_Coord,
|
|
||||||
"styles for :-moz-radio are incorrect or author-accessible");
|
|
||||||
nscoord width = myPosition->mWidth.GetCoordValue();
|
|
||||||
nscoord height = myPosition->mHeight.GetCoordValue();
|
|
||||||
// Position the button centered within the radio control's rectangle.
|
|
||||||
nscoord x = (mRect.width - width) / 2;
|
|
||||||
nscoord y = (mRect.height - height) / 2;
|
|
||||||
nsRect rect = nsRect(x, y, width, height) + aPt;
|
|
||||||
|
|
||||||
// So we will use PaintBackgroundWithSC to paint the dot,
|
|
||||||
// but it uses the mBackgroundColor for painting and we need to use the mColor
|
|
||||||
// so create a temporary style color struct and set it up appropriately
|
|
||||||
// XXXldb It would make more sense to use
|
|
||||||
// |aRenderingContext.FillEllipse| here, but on at least GTK that
|
|
||||||
// doesn't draw a round enough circle.
|
|
||||||
nsStyleBackground tmpColor = *myColor;
|
|
||||||
tmpColor.mBackgroundColor = color->mColor;
|
|
||||||
nsPresContext* pc = PresContext();
|
|
||||||
nsCSSRendering::PaintBackgroundWithSC(pc, aRenderingContext,
|
|
||||||
this, aDirtyRect, rect,
|
|
||||||
tmpColor, *myBorder, PR_FALSE);
|
|
||||||
nsCSSRendering::PaintBorder(pc, aRenderingContext, this,
|
|
||||||
aDirtyRect, rect, *myBorder, mRadioButtonFaceStyle, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
class nsDisplayRadioButtonFromStyle : public nsDisplayItem {
|
|
||||||
public:
|
|
||||||
nsDisplayRadioButtonFromStyle(nsGfxRadioControlFrame* aFrame)
|
|
||||||
: nsDisplayItem(aFrame) {
|
|
||||||
MOZ_COUNT_CTOR(nsDisplayRadioButtonFromStyle);
|
|
||||||
}
|
|
||||||
#ifdef NS_BUILD_REFCNT_LOGGING
|
|
||||||
virtual ~nsDisplayRadioButtonFromStyle() {
|
|
||||||
MOZ_COUNT_DTOR(nsDisplayRadioButtonFromStyle);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual void Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx,
|
|
||||||
const nsRect& aDirtyRect);
|
|
||||||
NS_DISPLAY_DECL_NAME("RadioButton")
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
nsDisplayRadioButtonFromStyle::Paint(nsDisplayListBuilder* aBuilder,
|
|
||||||
nsIRenderingContext* aCtx, const nsRect& aDirtyRect) {
|
|
||||||
static_cast<nsGfxRadioControlFrame*>(mFrame)->
|
|
||||||
PaintRadioButtonFromStyle(*aCtx, aBuilder->ToReferenceFrame(mFrame), aDirtyRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsGfxRadioControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
nsGfxRadioControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
const nsDisplayListSet& aLists)
|
const nsDisplayListSet& aLists)
|
||||||
{
|
{
|
||||||
nsresult rv = nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
|
nsresult rv = nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect,
|
||||||
|
aLists);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
if (!IsVisibleForPainting(aBuilder))
|
if (!IsVisibleForPainting(aBuilder))
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
if (IsThemed())
|
if (IsThemed())
|
||||||
return NS_OK; // No need to paint the radio button. The theme will do it.
|
return NS_OK; // The theme will paint the check, if any.
|
||||||
|
|
||||||
if (!mRadioButtonFaceStyle)
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
PRBool checked = PR_TRUE;
|
PRBool checked = PR_TRUE;
|
||||||
GetCurrentCheckState(&checked); // Get check state from the content model
|
GetCurrentCheckState(&checked); // Get check state from the content model
|
||||||
if (!checked)
|
if (!checked)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
return aLists.Content()->AppendNewToTop(new (aBuilder)
|
return aLists.Content()->AppendNewToTop(new (aBuilder)
|
||||||
nsDisplayRadioButtonFromStyle(this));
|
nsDisplayGeneric(this, PaintCheckedRadioButton, "CheckedRadioButton"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsGfxRadioControlFrame::OnChecked(nsPresContext* aPresContext,
|
nsGfxRadioControlFrame::OnChecked(nsPresContext* aPresContext,
|
||||||
PRBool aChecked)
|
PRBool aChecked)
|
||||||
|
@ -217,4 +132,3 @@ nsGfxRadioControlFrame::OnChecked(nsPresContext* aPresContext,
|
||||||
InvalidateOverflowRect();
|
InvalidateOverflowRect();
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,45 +47,24 @@ class nsIAccessible;
|
||||||
|
|
||||||
// nsGfxRadioControlFrame
|
// nsGfxRadioControlFrame
|
||||||
|
|
||||||
#define NS_GFX_RADIO_CONTROL_FRAME_FACE_CONTEXT_INDEX 0 // for additional style contexts
|
|
||||||
#define NS_GFX_RADIO_CONTROL_FRAME_LAST_CONTEXT_INDEX 0
|
|
||||||
|
|
||||||
class nsGfxRadioControlFrame : public nsFormControlFrame,
|
class nsGfxRadioControlFrame : public nsFormControlFrame,
|
||||||
public nsIRadioControlFrame
|
public nsIRadioControlFrame
|
||||||
|
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
nsGfxRadioControlFrame(nsStyleContext* aContext);
|
nsGfxRadioControlFrame(nsStyleContext* aContext);
|
||||||
~nsGfxRadioControlFrame();
|
~nsGfxRadioControlFrame();
|
||||||
|
|
||||||
NS_DECL_QUERYFRAME
|
NS_DECL_QUERYFRAME
|
||||||
|
|
||||||
//nsIRadioControlFrame methods
|
|
||||||
NS_IMETHOD Init(nsIContent* aContent,
|
|
||||||
nsIFrame* aParent,
|
|
||||||
nsIFrame* asPrevInFlow);
|
|
||||||
|
|
||||||
#ifdef ACCESSIBILITY
|
#ifdef ACCESSIBILITY
|
||||||
NS_IMETHOD GetAccessible(nsIAccessible** aAccessible);
|
NS_IMETHOD GetAccessible(nsIAccessible** aAccessible);
|
||||||
#endif
|
#endif
|
||||||
NS_IMETHOD OnChecked(nsPresContext* aPresContext, PRBool aChecked);
|
NS_IMETHOD OnChecked(nsPresContext* aPresContext, PRBool aChecked);
|
||||||
|
|
||||||
virtual nsStyleContext* GetAdditionalStyleContext(PRInt32 aIndex) const;
|
|
||||||
virtual void SetAdditionalStyleContext(PRInt32 aIndex,
|
|
||||||
nsStyleContext* aStyleContext);
|
|
||||||
|
|
||||||
NS_IMETHOD BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
NS_IMETHOD BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
const nsDisplayListSet& aLists);
|
const nsDisplayListSet& aLists);
|
||||||
|
|
||||||
void PaintRadioButtonFromStyle(nsIRenderingContext& aRenderingContext, nsPoint aPt,
|
|
||||||
const nsRect& aDirtyRect);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
nsRefPtr<nsStyleContext> mRadioButtonFaceStyle;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
<meta http-equiv="msthemecompatible" content="no">
|
<input type="radio">
|
||||||
<input type="radio">
|
<input type="radio">
|
||||||
<input type="radio">
|
<input type="radio">
|
||||||
<input type="radio">
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
<meta http-equiv="msthemecompatible" content="no">
|
<input type="radio" style="width: auto">
|
||||||
<input type="radio" style="width: auto">
|
<input type="radio" style="height: auto">
|
||||||
<input type="radio" style="height: auto">
|
<input type="radio" style="height: auto; width: auto">
|
||||||
<input type="radio" style="height: auto; width: auto">
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
<input type="radio" style="-moz-appearance:none">
|
||||||
|
<input type="radio" style="-moz-appearance:none">
|
||||||
|
<input type="radio" style="-moz-appearance:none">
|
|
@ -0,0 +1,3 @@
|
||||||
|
<input type="radio" style="width: auto; -moz-appearance: none">
|
||||||
|
<input type="radio" style="height: auto; -moz-appearance: none">
|
||||||
|
<input type="radio" style="height: auto; width: auto; -moz-appearance: none">
|
|
@ -0,0 +1,3 @@
|
||||||
|
<input type="checkbox">
|
||||||
|
<input type="checkbox">
|
||||||
|
<input type="checkbox">
|
|
@ -0,0 +1,3 @@
|
||||||
|
<input type="checkbox" style="width: auto">
|
||||||
|
<input type="checkbox" style="height: auto">
|
||||||
|
<input type="checkbox" style="height: auto; width: auto">
|
|
@ -0,0 +1,3 @@
|
||||||
|
<input type="checkbox" style="-moz-appearance:none">
|
||||||
|
<input type="checkbox" style="-moz-appearance:none">
|
||||||
|
<input type="checkbox" style="-moz-appearance:none">
|
|
@ -0,0 +1,3 @@
|
||||||
|
<input type="checkbox" style="width: auto; -moz-appearance: none">
|
||||||
|
<input type="checkbox" style="height: auto; -moz-appearance: none">
|
||||||
|
<input type="checkbox" style="height: auto; width: auto; -moz-appearance: none">
|
|
@ -578,6 +578,9 @@ random-if(MOZ_WIDGET_TOOLKIT=="gtk2") == 368020-5.html 368020-5-ref.html # bug 3
|
||||||
== 373295-1.html 373295-1-ref.html
|
== 373295-1.html 373295-1-ref.html
|
||||||
== 373298-1.html 373298-1-ref.html
|
== 373298-1.html 373298-1-ref.html
|
||||||
== 373381-1.html 373381-1-ref.html
|
== 373381-1.html 373381-1-ref.html
|
||||||
|
== 373381-2.html 373381-2-ref.html
|
||||||
|
== 373381-3.html 373381-3-ref.html
|
||||||
|
== 373381-4.html 373381-4-ref.html
|
||||||
== 375508-1.html 375508-1-ref.html
|
== 375508-1.html 375508-1-ref.html
|
||||||
== 373433-1.html 373433-1-ref.html
|
== 373433-1.html 373433-1-ref.html
|
||||||
== 372062-1.html 372062-1-ref.html
|
== 372062-1.html 372062-1-ref.html
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="checkbox">
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="checkbox" checked>
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="checkbox" style="-moz-appearance:none">
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="checkbox" style="-moz-appearance:none" checked>
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="radio">
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="radio" checked>
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="radio" style="-moz-appearance:none">
|
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<input type="radio" style="-moz-appearance:none" checked>
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
== checkbox-label-dynamic.html checkbox-label-dynamic-ref.html
|
== checkbox-label-dynamic.html checkbox-label-dynamic-ref.html
|
||||||
== checkbox-radio-stretched.html checkbox-radio-stretched-ref.html # bug 464589
|
== checkbox-radio-stretched.html checkbox-radio-stretched-ref.html # bug 464589
|
||||||
== input-file-width-clip-1.html input-file-width-clip-ref.html # bug 409587
|
== input-file-width-clip-1.html input-file-width-clip-ref.html # bug 409587
|
||||||
|
@ -10,3 +11,17 @@
|
||||||
!= indeterminate-native-checked.html indeterminate-native-checked-notref.html
|
!= indeterminate-native-checked.html indeterminate-native-checked-notref.html
|
||||||
!= indeterminate-native-unchecked.html indeterminate-native-unchecked-notref.html
|
!= indeterminate-native-unchecked.html indeterminate-native-unchecked-notref.html
|
||||||
== indeterminate-selector.html indeterminate-selector-ref.html
|
== indeterminate-selector.html indeterminate-selector-ref.html
|
||||||
|
|
||||||
|
!= checkbox-checked.html checkbox-checked-notref.html
|
||||||
|
!= checkbox-checked-native.html checkbox-checked-native-notref.html
|
||||||
|
!= radio-checked.html radio-checked-notref.html
|
||||||
|
!= radio-checked-native.html radio-checked-native-notref.html
|
||||||
|
|
||||||
|
!= checkbox-checked.html about:blank
|
||||||
|
!= checkbox-checked-notref.html about:blank
|
||||||
|
!= radio-checked.html about:blank
|
||||||
|
!= radio-checked-notref.html about:blank
|
||||||
|
!= checkbox-checked-native.html about:blank
|
||||||
|
!= checkbox-checked-native-notref.html about:blank
|
||||||
|
!= radio-checked-native.html about:blank
|
||||||
|
!= radio-checked-native-notref.html about:blank
|
||||||
|
|
|
@ -405,35 +405,33 @@ input[type="file"] > input[type="button"] {
|
||||||
/* radio buttons */
|
/* radio buttons */
|
||||||
input[type="radio"] {
|
input[type="radio"] {
|
||||||
-moz-appearance: radio;
|
-moz-appearance: radio;
|
||||||
width: 13px;
|
|
||||||
height: 13px;
|
|
||||||
margin: 3px 3px 0px 5px;
|
margin: 3px 3px 0px 5px;
|
||||||
padding: 0 !important;
|
|
||||||
cursor: default;
|
|
||||||
-moz-binding: none;
|
|
||||||
|
|
||||||
-moz-border-radius: 100% !important;
|
-moz-border-radius: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check boxes */
|
/* check boxes */
|
||||||
input[type="checkbox"] {
|
input[type="checkbox"] {
|
||||||
-moz-appearance: checkbox;
|
-moz-appearance: checkbox;
|
||||||
width: 13px;
|
|
||||||
height: 13px;
|
|
||||||
margin: 3px 3px 3px 4px;
|
margin: 3px 3px 3px 4px;
|
||||||
padding: 0 !important;
|
|
||||||
cursor: default;
|
|
||||||
-moz-binding: none;
|
|
||||||
|
|
||||||
-moz-border-radius: 0 !important;
|
-moz-border-radius: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* common features of radio buttons and check boxes */
|
/* common features of radio buttons and check boxes */
|
||||||
|
|
||||||
|
/* NOTE: The width, height, border-width, and padding here must all
|
||||||
|
add up the way nsFormControlFrame::GetIntrinsic(Width|Height)
|
||||||
|
expects them to, or they will not come out with total width equal
|
||||||
|
to total height on sites that set their 'width' or 'height' to 'auto'.
|
||||||
|
(Should we maybe set !important on width and height, then?) */
|
||||||
input[type="radio"],
|
input[type="radio"],
|
||||||
input[type="checkbox"] {
|
input[type="checkbox"] {
|
||||||
/* same colors as |input| rule, but |!important| this time. */
|
|
||||||
-moz-box-sizing: border-box;
|
-moz-box-sizing: border-box;
|
||||||
|
width: 13px;
|
||||||
|
height: 13px;
|
||||||
|
cursor: default;
|
||||||
|
padding: 0 !important;
|
||||||
|
-moz-binding: none;
|
||||||
|
/* same colors as |input| rule, but |!important| this time. */
|
||||||
background-color: -moz-Field ! important;
|
background-color: -moz-Field ! important;
|
||||||
color: -moz-FieldText ! important;
|
color: -moz-FieldText ! important;
|
||||||
border: 2px inset ThreeDFace ! important;
|
border: 2px inset ThreeDFace ! important;
|
||||||
|
@ -466,13 +464,6 @@ input[type="radio"]:hover:active {
|
||||||
border-style: inset !important;
|
border-style: inset !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
*|*::-moz-radio {
|
|
||||||
width: 4px;
|
|
||||||
height: 4px;
|
|
||||||
background-color: -moz-FieldText ! important;
|
|
||||||
-moz-border-radius: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* buttons */
|
/* buttons */
|
||||||
|
|
||||||
/* Note: Values in nsNativeTheme IsWidgetStyled function
|
/* Note: Values in nsNativeTheme IsWidgetStyled function
|
||||||
|
|
|
@ -67,8 +67,6 @@ CSS_ANON_BOX(cellContent, ":-moz-cell-content")
|
||||||
CSS_ANON_BOX(dropDownList, ":-moz-dropdown-list")
|
CSS_ANON_BOX(dropDownList, ":-moz-dropdown-list")
|
||||||
CSS_ANON_BOX(fieldsetContent, ":-moz-fieldset-content")
|
CSS_ANON_BOX(fieldsetContent, ":-moz-fieldset-content")
|
||||||
CSS_ANON_BOX(framesetBlank, ":-moz-frameset-blank")
|
CSS_ANON_BOX(framesetBlank, ":-moz-frameset-blank")
|
||||||
CSS_ANON_BOX(radio, ":-moz-radio")
|
|
||||||
CSS_ANON_BOX(check, ":-moz-checkbox")
|
|
||||||
CSS_ANON_BOX(mozDisplayComboboxControlFrame, ":-moz-display-comboboxcontrol-frame")
|
CSS_ANON_BOX(mozDisplayComboboxControlFrame, ":-moz-display-comboboxcontrol-frame")
|
||||||
|
|
||||||
CSS_ANON_BOX(inlineTable, ":-moz-inline-table")
|
CSS_ANON_BOX(inlineTable, ":-moz-inline-table")
|
||||||
|
|
Загрузка…
Ссылка в новой задаче