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 18 namespace blink { 19 20 // FIXME: We already have IDL dictionary support; this should be removed. 21 // http://crbug.com/403150 22 struct HitRegionOptionsInternal { 23 STACK_ALLOCATED(); 24 25 public: 26 String id; 27 RefPtrWillBeMember<Element> control; 28 Path path; 29 WindRule fillRule; 30 }; 31 32 class HitRegion FINAL : public RefCountedWillBeGarbageCollectedFinalized<HitRegion> { 33 public: 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 53 private: 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 62 class HitRegionManager FINAL : public NoBaseWillBeGarbageCollected<HitRegionManager> { 63 WTF_MAKE_NONCOPYABLE(HitRegionManager); 64 DECLARE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(HitRegionManager) 65 public: 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 84 private: 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