WebKit Bugzilla
Attachment 358853 Details for
Bug 193227
: Web Inspector: Audit: provide a way to get related Accessibility properties for a given node
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
193227.diff (text/plain), 12.56 KB, created by
Devin Rousso
on 2019-01-10 17:03:12 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Devin Rousso
Created:
2019-01-10 17:03:12 PST
Size:
12.56 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c05068dc003..fd636f55b04 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,19 @@ >+2019-01-10 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: Audit: provide a way to get related Accessibility properties for a given node >+ https://bugs.webkit.org/show_bug.cgi?id=193227 >+ <rdar://problem/46787862> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests (OOPS!). >+ >+ * inspector/InspectorAuditAccessibilityUtilities.idl: >+ * inspector/InspectorAuditAccessibilityUtilities.h: >+ * inspector/InspectorAuditAccessibilityUtilities.cpp: >+ (WebCore::accessiblityObjectForNode): Added. >+ (WebCore::InspectorAuditAccessibilityUtilities::getComputedProperties): Added. >+ > 2019-01-10 Devin Rousso <drousso@apple.com> > > Web Inspector: Audit: create new IDL type for exposing special functionality in test context >diff --git a/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.cpp b/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.cpp >index 3c84fc3b9ca..5b837b215ad 100644 >--- a/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.cpp >+++ b/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.cpp >@@ -27,12 +27,157 @@ > #include "config.h" > #include "InspectorAuditAccessibilityUtilities.h" > >+#include "AXObjectCache.h" >+#include "AccessibilityObject.h" >+#include "Element.h" >+#include "Node.h" >+#include "SpaceSplitString.h" >+#include <wtf/Vector.h> >+#include <wtf/text/WTFString.h> >+ > namespace WebCore { > > using namespace Inspector; > >-InspectorAuditAccessibilityUtilities::InspectorAuditAccessibilityUtilities() >+#define ERROR_IF_NO_ACTIVE_AUDIT() if (!m_auditAgent.hasActiveAudit()) return Exception { NotAllowedError, "Unable to run outside of an Inspector Audit"_s }; >+ >+InspectorAuditAccessibilityUtilities::InspectorAuditAccessibilityUtilities(InspectorAuditAgent& auditAgent) >+ : m_auditAgent(auditAgent) > { > } > >+static AccessibilityObject* accessiblityObjectForNode(Node& node) >+{ >+ if (!AXObjectCache::accessibilityEnabled()) >+ AXObjectCache::enableAccessibility(); >+ >+ if (AXObjectCache* axObjectCache = node.document().axObjectCache()) >+ return axObjectCache->getOrCreate(&node); >+ return nullptr; >+} >+ >+ExceptionOr<Optional<InspectorAuditAccessibilityUtilities::ComputedProperties>> InspectorAuditAccessibilityUtilities::getComputedProperties(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ Optional<InspectorAuditAccessibilityUtilities::ComputedProperties> result; >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ ComputedProperties computedProperties; >+ >+ AccessibilityObject* current = axObject; >+ while (current && (!computedProperties.busy || !computedProperties.busy.value())) { >+ computedProperties.busy = current->isBusy(); >+ current = current->parentObject(); >+ } >+ >+ if (axObject->supportsChecked()) { >+ AccessibilityButtonState checkValue = axObject->checkboxOrRadioValue(); >+ if (checkValue == AccessibilityButtonState::On) >+ computedProperties.checked = "true"_s; >+ else if (checkValue == AccessibilityButtonState::Mixed) >+ computedProperties.checked = "mixed"_s; >+ else if (axObject->isChecked()) >+ computedProperties.checked = "true"_s; >+ else >+ computedProperties.checked = "false"_s; >+ } >+ >+ switch (axObject->currentState()) { >+ case AccessibilityCurrentState::False: >+ computedProperties.currentState = "false"_s; >+ break; >+ case AccessibilityCurrentState::True: >+ computedProperties.currentState = "true"_s; >+ break; >+ case AccessibilityCurrentState::Page: >+ computedProperties.currentState = "page"_s; >+ break; >+ case AccessibilityCurrentState::Step: >+ computedProperties.currentState = "step"_s; >+ break; >+ case AccessibilityCurrentState::Location: >+ computedProperties.currentState = "location"_s; >+ break; >+ case AccessibilityCurrentState::Date: >+ computedProperties.currentState = "date"_s; >+ break; >+ case AccessibilityCurrentState::Time: >+ computedProperties.currentState = "time"_s; >+ break; >+ } >+ >+ computedProperties.disabled = !axObject->isEnabled(); >+ >+ if (axObject->supportsExpanded()) >+ computedProperties.expanded = axObject->isExpanded(); >+ >+ if (is<Element>(node) && axObject->canSetFocusAttribute()) >+ computedProperties.focused = axObject->isFocused(); >+ >+ computedProperties.headingLevel = axObject->headingLevel(); >+ computedProperties.hidden = axObject->isAXHidden() || axObject->isDOMHidden(); >+ computedProperties.hierarchicalLevel = axObject->hierarchicalLevel(); >+ computedProperties.ignored = axObject->accessibilityIsIgnored(); >+ computedProperties.ignoredByDefault = axObject->accessibilityIsIgnoredByDefault(); >+ >+ String invalidValue = axObject->invalidStatus(); >+ if (invalidValue == "false") >+ computedProperties.invalidStatus = "false"_s; >+ else if (invalidValue == "grammar") >+ computedProperties.invalidStatus = "grammar"_s; >+ else if (invalidValue == "spelling") >+ computedProperties.invalidStatus = "spelling"_s; >+ else >+ computedProperties.invalidStatus = "true"_s; >+ >+ computedProperties.isPopUpButton = axObject->isPopUpButton() || axObject->hasPopup(); >+ computedProperties.label = axObject->computedLabel(); >+ >+ if (axObject->supportsLiveRegion()) { >+ computedProperties.liveRegionAtomic = axObject->liveRegionAtomic(); >+ >+ String ariaRelevantAttrValue = axObject->liveRegionRelevant(); >+ if (!ariaRelevantAttrValue.isEmpty()) { >+ Vector<String> liveRegionRelevant; >+ String ariaRelevantAdditions = "additions"; >+ String ariaRelevantRemovals = "removals"; >+ String ariaRelevantText = "text"; >+ >+ const auto& values = SpaceSplitString(ariaRelevantAttrValue, true); >+ if (values.contains("all")) { >+ liveRegionRelevant.append(ariaRelevantAdditions); >+ liveRegionRelevant.append(ariaRelevantRemovals); >+ liveRegionRelevant.append(ariaRelevantText); >+ } else { >+ if (values.contains(ariaRelevantAdditions)) >+ liveRegionRelevant.append(ariaRelevantAdditions); >+ if (values.contains(ariaRelevantRemovals)) >+ liveRegionRelevant.append(ariaRelevantRemovals); >+ if (values.contains(ariaRelevantText)) >+ liveRegionRelevant.append(ariaRelevantText); >+ } >+ computedProperties.liveRegionRelevant = liveRegionRelevant; >+ } >+ >+ computedProperties.liveRegionStatus = axObject->liveRegionStatus(); >+ } >+ >+ computedProperties.pressed = axObject->pressedIsPresent() && axObject->isPressed(); >+ >+ if (axObject->isTextControl()) >+ computedProperties.readonly = !axObject->canSetValueAttribute(); >+ >+ if (axObject->supportsRequiredAttribute()) >+ computedProperties.required = axObject->isRequired(); >+ >+ computedProperties.role = axObject->computedRoleString(); >+ computedProperties.selected = axObject->isSelected(); >+ >+ result = computedProperties; >+ } >+ >+ return result; >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.h b/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.h >index 37c67bb1f25..e9e089f43de 100644 >--- a/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.h >+++ b/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.h >@@ -25,20 +25,54 @@ > > #pragma once > >+#include "ExceptionOr.h" >+#include <JavaScriptCore/InspectorAuditAgent.h> >+#include <wtf/Forward.h> >+#include <wtf/Optional.h> > #include <wtf/Ref.h> > #include <wtf/RefCounted.h> > > namespace WebCore { > >+class Node; >+ > class InspectorAuditAccessibilityUtilities : public RefCounted<InspectorAuditAccessibilityUtilities> { > public: >- static Ref<InspectorAuditAccessibilityUtilities> create() >+ static Ref<InspectorAuditAccessibilityUtilities> create(Inspector::InspectorAuditAgent& auditAgent) > { >- return adoptRef(*new InspectorAuditAccessibilityUtilities()); >+ return adoptRef(*new InspectorAuditAccessibilityUtilities(auditAgent)); > } > >+ struct ComputedProperties { >+ Optional<bool> busy; >+ String checked; >+ String currentState; >+ Optional<bool> disabled; >+ Optional<bool> expanded; >+ Optional<bool> focused; >+ Optional<int> headingLevel; >+ Optional<bool> hidden; >+ Optional<int> hierarchicalLevel; >+ Optional<bool> ignored; >+ Optional<bool> ignoredByDefault; >+ String invalidStatus; >+ Optional<bool> isPopUpButton; >+ String label; >+ Optional<bool> liveRegionAtomic; >+ Optional<Vector<String>> liveRegionRelevant; >+ String liveRegionStatus; >+ Optional<bool> pressed; >+ Optional<bool> readonly; >+ Optional<bool> required; >+ String role; >+ Optional<bool> selected; >+ }; >+ ExceptionOr<Optional<ComputedProperties>> getComputedProperties(Node&); >+ > private: >- explicit InspectorAuditAccessibilityUtilities(); >+ explicit InspectorAuditAccessibilityUtilities(Inspector::InspectorAuditAgent&); >+ >+ Inspector::InspectorAuditAgent& m_auditAgent; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.idl b/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.idl >index 7ccd72bb093..03276aea61e 100644 >--- a/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.idl >+++ b/Source/WebCore/inspector/InspectorAuditAccessibilityUtilities.idl >@@ -28,4 +28,32 @@ > JSGenerateToJSObject, > NoInterfaceObject, > ] interface InspectorAuditAccessibilityUtilities { >+ [MayThrowException] ComputedProperties? getComputedProperties(Node node); >+}; >+ >+[ >+ JSGenerateToJSObject, >+] dictionary ComputedProperties { >+ boolean? busy; >+ DOMString? checked; >+ DOMString? currentState; >+ boolean? disabled; >+ boolean? expanded; >+ boolean? focused; >+ long? headingLevel; >+ boolean? hidden; >+ long? hierarchicalLevel; >+ boolean? ignored; >+ boolean? ignoredByDefault; >+ DOMString? invalidStatus; >+ boolean? isPopUpButton; >+ DOMString? label; >+ boolean? liveRegionAtomic; >+ sequence<DOMString>? liveRegionRelevant; >+ DOMString? liveRegionStatus; >+ boolean? pressed; >+ boolean? readonly; >+ boolean? required; >+ DOMString? role; >+ boolean? selected; > }; >diff --git a/Source/WebCore/inspector/InspectorAuditDOMUtilities.h b/Source/WebCore/inspector/InspectorAuditDOMUtilities.h >index 3a4af637eff..b1feb3a0be2 100644 >--- a/Source/WebCore/inspector/InspectorAuditDOMUtilities.h >+++ b/Source/WebCore/inspector/InspectorAuditDOMUtilities.h >@@ -25,6 +25,7 @@ > > #pragma once > >+#include <JavaScriptCore/InspectorAuditAgent.h> > #include <wtf/Ref.h> > #include <wtf/RefCounted.h> > >@@ -32,7 +33,7 @@ namespace WebCore { > > class InspectorAuditDOMUtilities : public RefCounted<InspectorAuditDOMUtilities> { > public: >- static Ref<InspectorAuditDOMUtilities> create() >+ static Ref<InspectorAuditDOMUtilities> create(Inspector::InspectorAuditAgent&) > { > return adoptRef(*new InspectorAuditDOMUtilities()); > } >diff --git a/Source/WebCore/inspector/agents/page/PageAuditAgent.cpp b/Source/WebCore/inspector/agents/page/PageAuditAgent.cpp >index dbe1d36f287..e13ba14258c 100644 >--- a/Source/WebCore/inspector/agents/page/PageAuditAgent.cpp >+++ b/Source/WebCore/inspector/agents/page/PageAuditAgent.cpp >@@ -82,7 +82,7 @@ Vector<std::pair<String, JSC::JSValue>> PageAuditAgent::runArguments(const int* > > #define ADD_AUDIT_UTILITIES(name) \ > if (!m_audit##name##Utilities) \ >- m_audit##name##Utilities = InspectorAudit##name##Utilities::create(); \ >+ m_audit##name##Utilities = InspectorAudit##name##Utilities::create(*this); \ > if (JSC::JSValue inspectorAudit##name##Utilities = toJS(execState, globalObject, *m_audit##name##Utilities)) \ > arguments.append(std::make_pair("" #name ""_s, WTFMove(inspectorAudit##name##Utilities))); >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193227
:
358569
|
358853
|
359775
|
359783