gecko-dev/accessible/html/HTMLImageMapAccessible.h
Nathan LaPre f8b9470054 Bug 854796: Anchor, area elements without href shouldn't have link role, r=Jamie,devtools-reviewers
Per the HTML-AAM spec, a and area elements without href attributes should have
generic roles. This revision implements this preference by creating hypertext
accessibles when said elements lack href attributes (or click listeners). A
byproduct of this change is recognizing that a elements have no intrinsic role
mapping; they could be generics or links. This revision handles situations
where href or click listeners might appear or dissapear, and recreates the
accessibles when necessary. Since image map areas are handled by their
containing image maps, this revision specializes HTMLAreaAccessible::NativeRole
to account for the discrepancy that we can't account for in the markup map.
This revision also changes the relevant WPT test expectations, updates existing
tests that this change affects, and adds tests to verify that changing href
and click listeners dynamically changes the role appropriately.

Differential Revision: https://phabricator.services.mozilla.com/D183550
2023-07-24 19:31:29 +00:00

83 lines
2.3 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/. */
#ifndef mozilla_a11y_HTMLImageMapAccessible_h__
#define mozilla_a11y_HTMLImageMapAccessible_h__
#include "HTMLLinkAccessible.h"
#include "ImageAccessible.h"
namespace mozilla {
namespace a11y {
/**
* Used for HTML image maps.
*/
class HTMLImageMapAccessible final : public ImageAccessible {
public:
HTMLImageMapAccessible(nsIContent* aContent, DocAccessible* aDoc);
// nsISupports and cycle collector
NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLImageMapAccessible, ImageAccessible)
// LocalAccessible
virtual a11y::role NativeRole() const override;
/**
* Update area children of the image map.
*/
void UpdateChildAreas(bool aDoFireEvents = true);
/**
* Return accessible of child node.
*/
LocalAccessible* GetChildAccessibleFor(const nsINode* aNode) const;
protected:
virtual ~HTMLImageMapAccessible() {}
};
/**
* Accessible for image map areas - must be child of image.
*/
class HTMLAreaAccessible final : public HTMLLinkAccessible {
public:
HTMLAreaAccessible(nsIContent* aContent, DocAccessible* aDoc);
// LocalAccessible
virtual void Description(nsString& aDescription) const override;
virtual LocalAccessible* LocalChildAtPoint(
int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild) override;
virtual nsRect RelativeBounds(nsIFrame** aBoundingFrame) const override;
virtual nsRect ParentRelativeBounds() override;
// HyperLinkAccessible
virtual uint32_t StartOffset() override;
virtual uint32_t EndOffset() override;
virtual bool IsAcceptableChild(nsIContent* aEl) const override {
return false;
}
// LocalAccessible
virtual role NativeRole() const override;
protected:
// LocalAccessible
virtual ENameValueFlag NativeName(nsString& aName) const override;
};
////////////////////////////////////////////////////////////////////////////////
// LocalAccessible downcasting method
inline HTMLImageMapAccessible* LocalAccessible::AsImageMap() {
return IsImageMap() ? static_cast<HTMLImageMapAccessible*>(this) : nullptr;
}
} // namespace a11y
} // namespace mozilla
#endif