1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef mozilla_a11y_HTMLImageMapAccessible_h__
7 #define mozilla_a11y_HTMLImageMapAccessible_h__
8 
9 #include "HTMLLinkAccessible.h"
10 #include "ImageAccessibleWrap.h"
11 
12 namespace mozilla {
13 namespace a11y {
14 
15 /**
16  * Used for HTML image maps.
17  */
18 class HTMLImageMapAccessible final : public ImageAccessibleWrap {
19  public:
20   HTMLImageMapAccessible(nsIContent* aContent, DocAccessible* aDoc);
21 
22   // nsISupports and cycle collector
23   NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLImageMapAccessible,
24                                        ImageAccessibleWrap)
25 
26   // LocalAccessible
27   virtual a11y::role NativeRole() const override;
28 
29   // HyperLinkAccessible
30   virtual uint32_t AnchorCount() override;
31   virtual LocalAccessible* AnchorAt(uint32_t aAnchorIndex) override;
32   virtual already_AddRefed<nsIURI> AnchorURIAt(
33       uint32_t aAnchorIndex) const override;
34 
35   /**
36    * Update area children of the image map.
37    */
38   void UpdateChildAreas(bool aDoFireEvents = true);
39 
40   /**
41    * Return accessible of child node.
42    */
43   LocalAccessible* GetChildAccessibleFor(const nsINode* aNode) const;
44 
45  protected:
~HTMLImageMapAccessible()46   virtual ~HTMLImageMapAccessible() {}
47 };
48 
49 /**
50  * Accessible for image map areas - must be child of image.
51  */
52 class HTMLAreaAccessible final : public HTMLLinkAccessible {
53  public:
54   HTMLAreaAccessible(nsIContent* aContent, DocAccessible* aDoc);
55 
56   // LocalAccessible
57   virtual void Description(nsString& aDescription) override;
58   virtual LocalAccessible* LocalChildAtPoint(
59       int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild) override;
60   virtual nsRect RelativeBounds(nsIFrame** aBoundingFrame) const override;
61 
62   // HyperLinkAccessible
63   virtual uint32_t StartOffset() override;
64   virtual uint32_t EndOffset() override;
65 
IsAcceptableChild(nsIContent * aEl)66   virtual bool IsAcceptableChild(nsIContent* aEl) const override {
67     return false;
68   }
69 
70  protected:
71   // LocalAccessible
72   virtual ENameValueFlag NativeName(nsString& aName) const override;
73 };
74 
75 ////////////////////////////////////////////////////////////////////////////////
76 // LocalAccessible downcasting method
77 
AsImageMap()78 inline HTMLImageMapAccessible* LocalAccessible::AsImageMap() {
79   return IsImageMap() ? static_cast<HTMLImageMapAccessible*>(this) : nullptr;
80 }
81 
82 }  // namespace a11y
83 }  // namespace mozilla
84 
85 #endif
86