OLD | NEW |
---|---|
(Empty) | |
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 #include "config.h" | |
6 #include "core/html/canvas/HitRegion.h" | |
7 | |
8 #include "core/accessibility/AXObjectCache.h" | |
9 #include "core/rendering/RenderBoxModelObject.h" | |
10 | |
11 namespace WebCore { | |
12 | |
13 HitRegion::HitRegion(const HitRegionOptions& options) | |
14 : m_id(options.id) | |
15 , m_control(options.control) | |
16 , m_path(options.path) | |
17 { | |
18 } | |
19 | |
20 void HitRegion::updateAccessibility(Element* canvas) | |
21 { | |
22 if (!m_control || !canvas || !canvas->renderer() || !m_control->isDescendant Of(canvas)) | |
23 return; | |
24 | |
25 FloatRect boundingRect = m_path.boundingRect(); | |
26 | |
27 // Offset by the canvas rect (We should take border and padding into account ). | |
dmazzoni
2014/06/09 07:27:26
What do you mean by "we should take border and pad
zino
2014/06/10 10:09:34
Done.
| |
28 RenderBoxModelObject* rbmo = canvas->renderBoxModelObject(); | |
29 IntRect canvasRect = canvas->renderer()->absoluteBoundingBoxRect(); | |
30 canvasRect.move(rbmo->borderLeft() + rbmo->paddingLeft(), | |
31 rbmo->borderTop() + rbmo->paddingTop()); | |
32 LayoutRect elementRect = enclosingLayoutRect(boundingRect); | |
33 elementRect.moveBy(canvasRect.location()); | |
34 | |
35 AXObjectCache* axObjectCache = m_control->document().existingAXObjectCache() ; | |
36 if (!axObjectCache) | |
dmazzoni
2014/06/09 07:27:26
Move this test up to the top; there's no reason to
zino
2014/06/10 10:09:34
Done.
| |
37 return; | |
38 | |
39 axObjectCache->setCanvasObjectBounds(m_control.get(), elementRect); | |
40 } | |
41 | |
42 bool HitRegion::contains(const LayoutPoint& point) const | |
43 { | |
44 if (!m_path.boundingRect().contains(point)) | |
45 return false; | |
46 | |
47 return m_path.contains(point, RULE_NONZERO); | |
48 } | |
49 | |
50 void HitRegion::removePixels(const Path& clearArea) | |
51 { | |
52 m_path.subtractPath(clearArea); | |
53 } | |
54 | |
55 void HitRegion::trace(Visitor* visitor) | |
56 { | |
57 #if ENABLE(OILPAN) | |
58 visitor->trace(m_control); | |
59 #endif | |
60 } | |
61 | |
62 void HitRegionManager::addHitRegion(PassRefPtrWillBeRawPtr<HitRegion> passHitReg ion) | |
63 { | |
64 RefPtrWillBeRawPtr<HitRegion> hitRegion = passHitRegion; | |
65 | |
66 m_hitRegionList.add(hitRegion); | |
67 | |
68 if (!hitRegion->id().isEmpty()) | |
69 m_hitRegionIdMap.set(hitRegion->id(), hitRegion); | |
70 | |
71 if (hitRegion->control()) | |
72 m_hitRegionControlMap.set(hitRegion->control(), hitRegion); | |
73 } | |
74 | |
75 void HitRegionManager::removeHitRegion(HitRegion* hitRegion) | |
76 { | |
77 if (!hitRegion) | |
78 return; | |
79 | |
80 if (!hitRegion->id().isEmpty()) | |
81 m_hitRegionIdMap.remove(hitRegion->id()); | |
82 | |
83 if (hitRegion->control()) | |
84 m_hitRegionControlMap.remove(hitRegion->control()); | |
85 | |
86 m_hitRegionList.remove(hitRegion); | |
87 } | |
88 | |
89 void HitRegionManager::removeHitRegionById(const String& id) | |
90 { | |
91 if (!id.isEmpty()) | |
92 removeHitRegion(getHitRegionById(id)); | |
93 } | |
94 | |
95 void HitRegionManager::removeHitRegionByControl(Element* control) | |
96 { | |
97 removeHitRegion(getHitRegionByControl(control)); | |
98 } | |
99 | |
100 void HitRegionManager::removeHitRegionsInRect(const FloatRect& rect, const Affin eTransform& ctm) | |
101 { | |
102 Path clearArea; | |
103 clearArea.addRect(rect); | |
104 clearArea.transform(ctm); | |
105 | |
106 HitRegionIterator itEnd = m_hitRegionList.rend(); | |
107 | |
108 for (HitRegionIterator it = m_hitRegionList.rbegin(); it != itEnd; ++it) { | |
109 RefPtrWillBeRawPtr<HitRegion> hitRegion = *it; | |
110 hitRegion->removePixels(clearArea); | |
111 if (hitRegion->path().isEmpty()) | |
112 removeHitRegion(hitRegion.get()); | |
113 } | |
114 } | |
115 | |
116 void HitRegionManager::removeAllHitRegions() | |
117 { | |
118 m_hitRegionList.clear(); | |
119 m_hitRegionIdMap.clear(); | |
120 } | |
121 | |
122 HitRegion* HitRegionManager::getHitRegionById(const String& id) const | |
123 { | |
124 return m_hitRegionIdMap.get(id); | |
125 } | |
126 | |
127 HitRegion* HitRegionManager::getHitRegionByControl(Element* control) const | |
128 { | |
129 if (control) | |
130 return m_hitRegionControlMap.get(control); | |
131 | |
132 return 0; | |
133 } | |
134 | |
135 HitRegion* HitRegionManager::getHitRegionAtPoint(const LayoutPoint& point) const | |
136 { | |
137 HitRegionIterator itEnd = m_hitRegionList.rend(); | |
138 | |
139 for (HitRegionIterator it = m_hitRegionList.rbegin(); it != itEnd; ++it) { | |
140 RefPtrWillBeRawPtr<HitRegion> hitRegion = *it; | |
141 if (hitRegion->contains(point)) | |
142 return hitRegion.get(); | |
143 } | |
144 | |
145 return 0; | |
146 } | |
147 | |
148 unsigned HitRegionManager::getHitRegionsCount() const | |
149 { | |
150 return m_hitRegionList.size(); | |
151 } | |
152 | |
153 void HitRegionManager::trace(Visitor* visitor) | |
154 { | |
155 #if ENABLE(OILPAN) | |
156 visitor->trace(m_hitRegionList); | |
157 visitor->trace(m_hitRegionIdMap); | |
158 visitor->trace(m_hitRegionControlMap); | |
159 #endif | |
160 } | |
161 | |
162 } // namespace WebCore | |
OLD | NEW |