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