OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | 2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 * Library General Public License for more details. | 12 * Library General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU Library General Public License | 14 * You should have received a copy of the GNU Library General Public License |
15 * along with this library; see the file COPYING.LIB. If not, write to | 15 * along with this library; see the file COPYING.LIB. If not, write to |
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
17 * Boston, MA 02110-1301, USA. | 17 * Boston, MA 02110-1301, USA. |
18 * | 18 * |
19 */ | 19 */ |
20 | 20 |
21 #include "core/html/HTMLMeterElement.h" | 21 #include "core/html/HTMLMeterElement.h" |
22 | 22 |
23 #include "bindings/core/v8/ExceptionMessages.h" | 23 #include "bindings/core/v8/ExceptionMessages.h" |
24 #include "bindings/core/v8/ExceptionState.h" | 24 #include "bindings/core/v8/ExceptionState.h" |
25 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 25 #include "bindings/core/v8/ExceptionStatePlaceholder.h" |
26 #include "core/HTMLNames.h" | 26 #include "core/HTMLNames.h" |
27 #include "core/dom/ExceptionCode.h" | 27 #include "core/dom/ExceptionCode.h" |
28 #include "core/dom/shadow/ShadowRoot.h" | 28 #include "core/dom/shadow/ShadowRoot.h" |
29 #include "core/frame/UseCounter.h" | 29 #include "core/frame/UseCounter.h" |
| 30 #include "core/html/HTMLDivElement.h" |
30 #include "core/html/parser/HTMLParserIdioms.h" | 31 #include "core/html/parser/HTMLParserIdioms.h" |
31 #include "core/html/shadow/MeterShadowElement.h" | 32 #include "core/layout/LayoutObject.h" |
32 #include "core/layout/LayoutMeter.h" | 33 #include "core/style/ComputedStyle.h" |
33 #include "core/layout/LayoutTheme.h" | |
34 | 34 |
35 namespace blink { | 35 namespace blink { |
36 | 36 |
37 using namespace HTMLNames; | 37 using namespace HTMLNames; |
38 | 38 |
39 HTMLMeterElement::HTMLMeterElement(Document& document) | 39 HTMLMeterElement::HTMLMeterElement(Document& document) |
40 : LabelableElement(meterTag, document) | 40 : LabelableElement(meterTag, document) |
41 { | 41 { |
42 UseCounter::count(document, UseCounter::MeterElement); | 42 UseCounter::count(document, UseCounter::MeterElement); |
43 } | 43 } |
44 | 44 |
45 HTMLMeterElement::~HTMLMeterElement() | 45 HTMLMeterElement::~HTMLMeterElement() |
46 { | 46 { |
47 } | 47 } |
48 | 48 |
49 PassRefPtrWillBeRawPtr<HTMLMeterElement> HTMLMeterElement::create(Document& docu
ment) | 49 PassRefPtrWillBeRawPtr<HTMLMeterElement> HTMLMeterElement::create(Document& docu
ment) |
50 { | 50 { |
51 RefPtrWillBeRawPtr<HTMLMeterElement> meter = adoptRefWillBeNoop(new HTMLMete
rElement(document)); | 51 RefPtrWillBeRawPtr<HTMLMeterElement> meter = adoptRefWillBeNoop(new HTMLMete
rElement(document)); |
52 meter->ensureUserAgentShadowRoot(); | 52 meter->ensureUserAgentShadowRoot(); |
53 return meter.release(); | 53 return meter.release(); |
54 } | 54 } |
55 | 55 |
56 LayoutObject* HTMLMeterElement::createLayoutObject(const ComputedStyle& style) | 56 LayoutObject* HTMLMeterElement::createLayoutObject(const ComputedStyle& style) |
57 { | 57 { |
58 switch (style.appearance()) { | 58 switch (style.appearance()) { |
59 case ContinuousCapacityLevelIndicatorPart: | |
60 UseCounter::count(document(), UseCounter::MeterElementWithContinuousCapa
cityAppearance); | |
61 break; | |
62 case DiscreteCapacityLevelIndicatorPart: | |
63 UseCounter::count(document(), UseCounter::MeterElementWithDiscreteCapaci
tyAppearance); | |
64 break; | |
65 case MeterPart: | 59 case MeterPart: |
66 UseCounter::count(document(), UseCounter::MeterElementWithMeterAppearanc
e); | 60 UseCounter::count(document(), UseCounter::MeterElementWithMeterAppearanc
e); |
67 break; | 61 break; |
68 case NoControlPart: | 62 case NoControlPart: |
69 UseCounter::count(document(), UseCounter::MeterElementWithNoneAppearance
); | 63 UseCounter::count(document(), UseCounter::MeterElementWithNoneAppearance
); |
70 break; | 64 break; |
71 case RatingLevelIndicatorPart: | |
72 UseCounter::count(document(), UseCounter::MeterElementWithRatingAppearan
ce); | |
73 break; | |
74 case RelevancyLevelIndicatorPart: | |
75 UseCounter::count(document(), UseCounter::MeterElementWithRelevancyAppea
rance); | |
76 break; | |
77 default: | 65 default: |
78 break; | 66 break; |
79 } | 67 } |
80 if (openShadowRoot() || !LayoutTheme::theme().supportsMeter(style.appearance
())) | 68 return LayoutObject::createObject(this, style); |
81 return LayoutObject::createObject(this, style); | |
82 return new LayoutMeter(this); | |
83 } | 69 } |
84 | 70 |
85 void HTMLMeterElement::parseAttribute(const QualifiedName& name, const AtomicStr
ing& oldValue, const AtomicString& value) | 71 void HTMLMeterElement::parseAttribute(const QualifiedName& name, const AtomicStr
ing& oldValue, const AtomicString& value) |
86 { | 72 { |
87 if (name == valueAttr || name == minAttr || name == maxAttr || name == lowAt
tr || name == highAttr || name == optimumAttr) | 73 if (name == valueAttr || name == minAttr || name == maxAttr || name == lowAt
tr || name == highAttr || name == optimumAttr) |
88 didElementStateChange(); | 74 didElementStateChange(); |
89 else | 75 else |
90 LabelableElement::parseAttribute(name, oldValue, value); | 76 LabelableElement::parseAttribute(name, oldValue, value); |
91 } | 77 } |
92 | 78 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 double max = this->max(); | 179 double max = this->max(); |
194 double value = this->value(); | 180 double value = this->value(); |
195 | 181 |
196 if (max <= min) | 182 if (max <= min) |
197 return 0; | 183 return 0; |
198 return (value - min) / (max - min); | 184 return (value - min) / (max - min); |
199 } | 185 } |
200 | 186 |
201 void HTMLMeterElement::didElementStateChange() | 187 void HTMLMeterElement::didElementStateChange() |
202 { | 188 { |
203 m_value->setWidthPercentage(valueRatio()*100); | 189 updateValueAppearance(valueRatio() * 100); |
204 m_value->updatePseudo(); | |
205 if (LayoutMeter* layoutMeter = this->layoutMeter()) | |
206 layoutMeter->updateFromElement(); | |
207 } | |
208 | |
209 LayoutMeter* HTMLMeterElement::layoutMeter() const | |
210 { | |
211 if (layoutObject() && layoutObject()->isMeter()) | |
212 return toLayoutMeter(layoutObject()); | |
213 | |
214 LayoutObject* layoutObject = userAgentShadowRoot()->firstChild()->layoutObje
ct(); | |
215 return toLayoutMeter(layoutObject); | |
216 } | 190 } |
217 | 191 |
218 void HTMLMeterElement::didAddUserAgentShadowRoot(ShadowRoot& root) | 192 void HTMLMeterElement::didAddUserAgentShadowRoot(ShadowRoot& root) |
219 { | 193 { |
220 ASSERT(!m_value); | 194 ASSERT(!m_value); |
221 | 195 |
222 RefPtrWillBeRawPtr<MeterInnerElement> inner = MeterInnerElement::create(docu
ment()); | 196 RefPtrWillBeRawPtr<HTMLDivElement> inner = HTMLDivElement::create(document()
); |
| 197 inner->setShadowPseudoId(AtomicString("-webkit-meter-inner-element", AtomicS
tring::ConstructFromLiteral)); |
223 root.appendChild(inner); | 198 root.appendChild(inner); |
224 | 199 |
225 RefPtrWillBeRawPtr<MeterBarElement> bar = MeterBarElement::create(document()
); | 200 RefPtrWillBeRawPtr<HTMLDivElement> bar = HTMLDivElement::create(document()); |
226 m_value = MeterValueElement::create(document()); | 201 bar->setShadowPseudoId(AtomicString("-webkit-meter-bar", AtomicString::Const
ructFromLiteral)); |
227 m_value->setWidthPercentage(0); | 202 |
228 m_value->updatePseudo(); | 203 m_value = HTMLDivElement::create(document()); |
| 204 updateValueAppearance(0); |
229 bar->appendChild(m_value); | 205 bar->appendChild(m_value); |
230 | 206 |
231 inner->appendChild(bar); | 207 inner->appendChild(bar); |
232 } | 208 } |
233 | 209 |
234 void HTMLMeterElement::willAddFirstAuthorShadowRoot() | 210 void HTMLMeterElement::willAddFirstAuthorShadowRoot() |
235 { | 211 { |
236 ASSERT(RuntimeEnabledFeatures::authorShadowDOMForAnyElementEnabled()); | 212 ASSERT(RuntimeEnabledFeatures::authorShadowDOMForAnyElementEnabled()); |
237 lazyReattachIfAttached(); | 213 lazyReattachIfAttached(); |
238 } | 214 } |
239 | 215 |
| 216 void HTMLMeterElement::updateValueAppearance(double percentage) |
| 217 { |
| 218 DEFINE_STATIC_LOCAL(AtomicString, optimumPseudoId, ("-webkit-meter-optimum-v
alue", AtomicString::ConstructFromLiteral)); |
| 219 DEFINE_STATIC_LOCAL(AtomicString, suboptimumPseudoId, ("-webkit-meter-subopt
imum-value", AtomicString::ConstructFromLiteral)); |
| 220 DEFINE_STATIC_LOCAL(AtomicString, evenLessGoodPseudoId, ("-webkit-meter-even
-less-good-value", AtomicString::ConstructFromLiteral)); |
| 221 |
| 222 m_value->setInlineStyleProperty(CSSPropertyWidth, percentage, CSSPrimitiveVa
lue::UnitType::Percentage); |
| 223 switch (gaugeRegion()) { |
| 224 case GaugeRegionOptimum: |
| 225 m_value->setShadowPseudoId(optimumPseudoId); |
| 226 break; |
| 227 case GaugeRegionSuboptimal: |
| 228 m_value->setShadowPseudoId(suboptimumPseudoId); |
| 229 break; |
| 230 case GaugeRegionEvenLessGood: |
| 231 m_value->setShadowPseudoId(evenLessGoodPseudoId); |
| 232 break; |
| 233 } |
| 234 } |
| 235 |
240 DEFINE_TRACE(HTMLMeterElement) | 236 DEFINE_TRACE(HTMLMeterElement) |
241 { | 237 { |
242 visitor->trace(m_value); | 238 visitor->trace(m_value); |
243 LabelableElement::trace(visitor); | 239 LabelableElement::trace(visitor); |
244 } | 240 } |
245 | 241 |
246 } // namespace blink | 242 } // namespace blink |
OLD | NEW |