1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef HitRegion_h
6#define HitRegion_h
7
8#include "bindings/core/v8/Dictionary.h"
9#include "core/dom/Element.h"
10#include "platform/graphics/Path.h"
11#include "platform/heap/Handle.h"
12#include "wtf/Noncopyable.h"
13#include "wtf/OwnPtr.h"
14#include "wtf/PassOwnPtr.h"
15#include "wtf/PassRefPtr.h"
16#include "wtf/RefPtr.h"
17
18namespace blink {
19
20// FIXME: We already have IDL dictionary support; this should be removed.
21// http://crbug.com/403150
22struct HitRegionOptionsInternal {
23    STACK_ALLOCATED();
24
25public:
26    String id;
27    RefPtrWillBeMember<Element> control;
28    Path path;
29    WindRule fillRule;
30};
31
32class HitRegion FINAL : public RefCountedWillBeGarbageCollectedFinalized<HitRegion> {
33public:
34    static PassRefPtrWillBeRawPtr<HitRegion> create(const HitRegionOptionsInternal& options)
35    {
36        return adoptRefWillBeNoop(new HitRegion(options));
37    }
38
39    virtual ~HitRegion() { }
40
41    void removePixels(const Path&);
42    void updateAccessibility(Element* canvas);
43
44    bool contains(const LayoutPoint&) const;
45
46    const String& id() const { return m_id; }
47    const Path& path() const { return m_path; }
48    Element* control() const { return m_control.get(); }
49    WindRule fillRule() const { return m_fillRule; }
50
51    void trace(Visitor*);
52
53private:
54    explicit HitRegion(const HitRegionOptionsInternal&);
55
56    String m_id;
57    RefPtrWillBeMember<Element> m_control;
58    Path m_path;
59    WindRule m_fillRule;
60};
61
62class HitRegionManager FINAL : public NoBaseWillBeGarbageCollected<HitRegionManager> {
63    WTF_MAKE_NONCOPYABLE(HitRegionManager);
64    DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(HitRegionManager)
65public:
66    static PassOwnPtrWillBeRawPtr<HitRegionManager> create() { return adoptPtrWillBeNoop(new HitRegionManager()); }
67
68    void addHitRegion(PassRefPtrWillBeRawPtr<HitRegion>);
69
70    void removeHitRegion(HitRegion*);
71    void removeHitRegionById(const String& id);
72    void removeHitRegionByControl(Element*);
73    void removeHitRegionsInRect(const FloatRect&, const AffineTransform&);
74    void removeAllHitRegions();
75
76    HitRegion* getHitRegionById(const String& id) const;
77    HitRegion* getHitRegionByControl(Element*) const;
78    HitRegion* getHitRegionAtPoint(const LayoutPoint&) const;
79
80    unsigned getHitRegionsCount() const;
81
82    void trace(Visitor*);
83
84private:
85    HitRegionManager() { }
86
87    typedef WillBeHeapListHashSet<RefPtrWillBeMember<HitRegion> > HitRegionList;
88    typedef HitRegionList::const_reverse_iterator HitRegionIterator;
89    typedef WillBeHeapHashMap<String, RefPtrWillBeMember<HitRegion> > HitRegionIdMap;
90    typedef WillBeHeapHashMap<RefPtrWillBeMember<Element>, RefPtrWillBeMember<HitRegion> > HitRegionControlMap;
91
92    HitRegionList m_hitRegionList;
93    HitRegionIdMap m_hitRegionIdMap;
94    HitRegionControlMap m_hitRegionControlMap;
95};
96
97} // namespace blink
98
99#endif
100