Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Reduce chromium noise #951

Merged
merged 10 commits into from
Jul 26, 2023
33 changes: 33 additions & 0 deletions src/Rules/Conditions/IsChromiumContentCondition.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Axe.Windows.Core.Bases;
using Axe.Windows.Rules.Resources;

using static Axe.Windows.Rules.PropertyConditions.ElementGroups;
using static Axe.Windows.Rules.PropertyConditions.Relationships;

namespace Axe.Windows.Rules
{
/// <summary>
/// Determines is the element is an element within the context of a Chromium document
/// </summary>
class IsChromiumContentCondition : Condition
DaveTryon marked this conversation as resolved.
Show resolved Hide resolved
{
private readonly Condition _isChromiumElement = IsChromiumDocument | AnyAncestor(IsChromiumDocument);

public IsChromiumContentCondition()
{
}

public override bool Matches(IA11yElement element)
{
return _isChromiumElement.Matches(element);
}

public override string ToString()
{
return ConditionDescriptions.IsChromiumContent;
}
} // class
} // namespace
8 changes: 3 additions & 5 deletions src/Rules/Library/ChromiumComponentsShouldUseWebScanner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@
using Axe.Windows.Core.Bases;
using Axe.Windows.Core.Enums;
using Axe.Windows.Rules.Resources;
using static Axe.Windows.Rules.PropertyConditions.ControlType;
using static Axe.Windows.Rules.PropertyConditions.Framework;
using static Axe.Windows.Rules.PropertyConditions.Relationships;
using static Axe.Windows.Rules.PropertyConditions.ElementGroups;

namespace Axe.Windows.Rules.Library
{
[RuleInfo(ID = RuleId.ChromiumComponentsShouldUseWebScanner)]
class ChromiumComponentsShouldUseWebScanner : Rule
{
public ChromiumComponentsShouldUseWebScanner()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could build an argument for renaming this to ChromiumDocumentsShouldUseWebScanner, but that would make the PR harder to review. Happy to put this into a subsequent PR if needed.

public ChromiumComponentsShouldUseWebScanner() : base(excludedCondition: null)
{
Info.Description = Descriptions.ChromiumComponentsShouldUseWebScanner;
Info.HowToFix = HowToFix.ChromiumComponentsShouldUseWebScanner;
Expand All @@ -27,7 +25,7 @@ public override bool PassesTest(IA11yElement e)

protected override Condition CreateCondition()
{
return Chrome & (Document | AnyAncestor(Document));
return IsChromiumDocument;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the change that limits ChromiumComponentsShouldUseWebScanner to just scan Chromium Documents

}
} // class
} // namespace
9 changes: 7 additions & 2 deletions src/Rules/Library/ClickablePointOffScreen.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Microsoft. All rights reserved.
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Axe.Windows.Core.Bases;
Expand All @@ -14,7 +14,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.ClickablePointOffScreen)]
class ClickablePointOffScreen : Rule
{
public ClickablePointOffScreen()
// Testable constructor
internal ClickablePointOffScreen(Condition excludedCondition) : base(excludedCondition)
{
Info.Description = Descriptions.ClickablePointOffScreen;
Info.HowToFix = HowToFix.ClickablePointOffScreen;
Expand All @@ -23,6 +24,10 @@ public ClickablePointOffScreen()
Info.ErrorCode = EvaluationCode.Warning;
}

public ClickablePointOffScreen() : this(DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
if (e == null) throw new ArgumentNullException(nameof(e));
Expand Down
9 changes: 7 additions & 2 deletions src/Rules/Library/ClickablePointOnScreen.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Microsoft. All rights reserved.
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Axe.Windows.Core.Bases;
Expand All @@ -15,7 +15,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.ClickablePointOnScreen)]
class ClickablePointOnScreen : Rule
{
public ClickablePointOnScreen()
// Testable constructor
public ClickablePointOnScreen(Condition excludedCondition) : base(excludedCondition)
{
Info.Description = Descriptions.ClickablePointOnScreen;
Info.HowToFix = HowToFix.ClickablePointOnScreen;
Expand All @@ -24,6 +25,10 @@ public ClickablePointOnScreen()
Info.ErrorCode = EvaluationCode.Error;
}

public ClickablePointOnScreen() : this(DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
if (e == null) throw new ArgumentNullException(nameof(e));
Expand Down
7 changes: 6 additions & 1 deletion src/Rules/Library/ClickablePointOnScreenWPF.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.ClickablePointOnScreenWPF)]
class ClickablePointOnScreenWPF : Rule
{
public ClickablePointOnScreenWPF()
// Testable constructor
public ClickablePointOnScreenWPF(Condition excludedCondition) : base(excludedCondition)
{
Info.Description = Descriptions.ClickablePointOnScreen;
Info.HowToFix = HowToFix.ClickablePointOnScreen;
Expand All @@ -25,6 +26,10 @@ public ClickablePointOnScreenWPF()
Info.FrameworkIssueLink = "https://go.microsoft.com/fwlink/?linkid=2214600";
}

public ClickablePointOnScreenWPF() : this(DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
if (e == null) throw new ArgumentNullException(nameof(e));
Expand Down
7 changes: 6 additions & 1 deletion src/Rules/Library/EdgeBrowserHasBeenDeprecated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.EdgeBrowserHasBeenDeprecated)]
class EdgeBrowserHasBeenDeprecated : Rule
{
public EdgeBrowserHasBeenDeprecated()
// Testable constructor
internal EdgeBrowserHasBeenDeprecated(Condition excludedCondition) : base (excludedCondition)
{
Info.Description = Descriptions.EdgeBrowserHasBeenDeprecated;
Info.HowToFix = HowToFix.EdgeBrowserHasBeenDeprecated;
Expand All @@ -20,6 +21,10 @@ public EdgeBrowserHasBeenDeprecated()
Info.FrameworkIssueLink = "https://go.microsoft.com/fwlink/?linkid=2214421";
}

public EdgeBrowserHasBeenDeprecated() : this (excludedCondition: DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
return false;
Expand Down
7 changes: 6 additions & 1 deletion src/Rules/Library/FrameworkDoesNotSupportUIAutomation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ class FrameworkDoesNotSupportUIAutomation : Rule
@"^\s*SunAwt.*$",
};

public FrameworkDoesNotSupportUIAutomation()
// Testable constructor
internal FrameworkDoesNotSupportUIAutomation(Condition excludedCondition) : base (excludedCondition)
{
Info.Description = Descriptions.FrameworkDoesNotSupportUIAutomation;
Info.HowToFix = HowToFix.FrameworkDoesNotSupportUIAutomation;
Expand All @@ -27,6 +28,10 @@ public FrameworkDoesNotSupportUIAutomation()
Info.FrameworkIssueLink = "https://go.microsoft.com/fwlink/?linkid=2214160";
}

public FrameworkDoesNotSupportUIAutomation() : this(excludedCondition: DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
string className = e.ClassName;
Expand Down
9 changes: 7 additions & 2 deletions src/Rules/Library/IsControlElementTrueRequired.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Microsoft. All rights reserved.
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Axe.Windows.Core.Bases;
Expand All @@ -14,7 +14,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.IsControlElementTrueRequired)]
class IsControlElementTrueRequired : Rule
{
public IsControlElementTrueRequired()
// Testable constructor
public IsControlElementTrueRequired(Condition excludedCondition) : base(excludedCondition)
{
Info.Description = Descriptions.IsControlElementTrueRequired;
Info.HowToFix = HowToFix.IsControlElementTrueRequired;
Expand All @@ -23,6 +24,10 @@ public IsControlElementTrueRequired()
Info.ErrorCode = EvaluationCode.Error;
}

public IsControlElementTrueRequired() : this(DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
if (e == null) throw new ArgumentNullException(nameof(e));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.IsControlElementTrueRequiredButtonWPF)]
class IsControlElementTrueRequiredButtonWPF : Rule
{
public IsControlElementTrueRequiredButtonWPF()
// Testable constructor
public IsControlElementTrueRequiredButtonWPF(Condition excludedCondition): base(excludedCondition)
{
Info.Description = Descriptions.IsControlElementTrueRequired;
Info.HowToFix = HowToFix.IsControlElementTrueRequired;
Expand All @@ -24,6 +25,10 @@ public IsControlElementTrueRequiredButtonWPF()
Info.FrameworkIssueLink = "https://go.microsoft.com/fwlink/?linkid=2214420";
}

public IsControlElementTrueRequiredButtonWPF() : this(DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
if (e == null) throw new ArgumentNullException(nameof(e));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.IsControlElementTrueRequiredTextInEditXAML)]
class IsControlElementTrueRequiredTextInEditXAML : Rule
{
public IsControlElementTrueRequiredTextInEditXAML()
// Testable constructor
public IsControlElementTrueRequiredTextInEditXAML(Condition excludedCondition) : base(excludedCondition)
{
Info.Description = Descriptions.IsControlElementTrueRequired;
Info.HowToFix = HowToFix.IsControlElementTrueRequired;
Expand All @@ -24,6 +25,10 @@ public IsControlElementTrueRequiredTextInEditXAML()
Info.FrameworkIssueLink = "https://go.microsoft.com/fwlink/?linkid=2214418";
}

public IsControlElementTrueRequiredTextInEditXAML() : this(DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
if (e == null) throw new ArgumentNullException(nameof(e));
Expand Down
9 changes: 7 additions & 2 deletions src/Rules/Library/ProgressBarRangeValue.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Microsoft. All rights reserved.
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Axe.Windows.Core.Bases;
Expand All @@ -14,7 +14,8 @@ namespace Axe.Windows.Rules.Library
[RuleInfo(ID = RuleId.ProgressBarRangeValue)]
class ProgressBarRangeValue : Rule
{
public ProgressBarRangeValue()
// Testable constructor
internal ProgressBarRangeValue(Condition excludedCondition) : base(excludedCondition)
{
Info.Description = Descriptions.ProgressBarRangeValue;
Info.HowToFix = HowToFix.ProgressBarRangeValue;
Expand All @@ -23,6 +24,10 @@ public ProgressBarRangeValue()
Info.ErrorCode = EvaluationCode.Error;
}

public ProgressBarRangeValue() : this(excludedCondition: DefaultExcludedCondition)
{
}

public override bool PassesTest(IA11yElement e)
{
if (e == null) throw new ArgumentNullException(nameof(e));
Expand Down
5 changes: 3 additions & 2 deletions src/Rules/PropertyConditions/ElementGroups.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
namespace Axe.Windows.Rules.PropertyConditions
{
/// <summary>
/// A collection of conditions representing elements grouped for miscellaneous rules.
/// A collection of conditions representing elements grouped for miscellaneous rules.
/// These are conditions which tend to be reused by multiple rules.
/// </summary>
static class ElementGroups
Expand Down Expand Up @@ -45,7 +45,8 @@ static class ElementGroups
public static Condition WPFButton = WPF & Button;
public static Condition XAMLTextInEdit = XAML & Text & Parent(Edit);
public static Condition WinFormsEdit = Edit & WinForms;

public static Condition IsChromiumDocument = Chrome & Document;
public static Condition IsChromiumContent = new IsChromiumContentCondition();
public static Condition AllowSameNameAndControlType = CreateAllowSameNameAndControlTypeCondition();

private static Condition CreateMinMaxCloseButtonCondition()
Expand Down
9 changes: 9 additions & 0 deletions src/Rules/Resources/ConditionDescriptions.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/Rules/Resources/ConditionDescriptions.resx
Original file line number Diff line number Diff line change
Expand Up @@ -286,4 +286,8 @@
<value>LocalizedLandmarkType</value>
<comment>Do not translate: the name of a UI Automation property.</comment>
</data>
<data name="IsChromiumContent" xml:space="preserve">
<value>IsChromiumContent</value>
<comment>{Locked}: a token used by the Axe.Windows domain-specific language for accessibility descriptions.</comment>
</data>
</root>
16 changes: 14 additions & 2 deletions src/Rules/Rule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Axe.Windows.Core.Exceptions;
using Axe.Windows.Core.Misc;
using Axe.Windows.Rules.Resources;
using static Axe.Windows.Rules.PropertyConditions.ElementGroups;

namespace Axe.Windows.Rules
{
Expand All @@ -19,17 +20,28 @@ abstract class Rule : IRule
{
public RuleInfo Info { get; private set; }
public Condition Condition { get; }
protected static Condition DefaultExcludedCondition => IsChromiumContent;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exposing this to derived classes gives us a single place to modify the default, then the production constructors of the derived classes just pick up the new value without requiring any additional code change


protected Rule()
protected Rule(Condition excludedCondition)
{
// keep these two calls in the following order or the RuleInfo.Condition string won't get populated
// keep these calls in the following order or the RuleInfo.Condition string won't get populated
#pragma warning disable CA2214
Condition = CreateCondition();
#pragma warning restore CA2214
Condition = CreateCondition();
DaveTryon marked this conversation as resolved.
Show resolved Hide resolved

if (excludedCondition != null)
{
Condition = Condition - excludedCondition;
}

InitRuleInfo();
}

protected Rule() : this (excludedCondition: DefaultExcludedCondition)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By default, exclude DefaultExcludedCondition

{
}

private void InitRuleInfo()
{
var info = GetRuleInfoFromAttributes();
Expand Down