15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/MeterShadowElement.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h"
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLMeterElement.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderMeter.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)inline MeterShadowElement::MeterShadowElement(Document& document)
4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    : HTMLDivElement(document)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLMeterElement* MeterShadowElement::meterElement() const
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return toHTMLMeterElement(shadowHost());
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool MeterShadowElement::rendererIsNeeded(const RenderStyle& style)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RenderObject* renderer = meterElement()->renderer();
588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return renderer && !RenderTheme::theme().supportsMeter(renderer->style()->appearance()) && HTMLDivElement::rendererIsNeeded(style);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)inline MeterInnerElement::MeterInnerElement(Document& document)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : MeterShadowElement(document)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
64521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
65521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
66d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MeterInnerElement> MeterInnerElement::create(Document& document)
67521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MeterInnerElement> element = adoptRefWillBeNoop(new MeterInnerElement(document));
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    element->setShadowPseudoId(AtomicString("-webkit-meter-inner-element", AtomicString::ConstructFromLiteral));
70521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return element.release();
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool MeterInnerElement::rendererIsNeeded(const RenderStyle& style)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (meterElement()->hasAuthorShadowRoot())
768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return HTMLDivElement::rendererIsNeeded(style);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RenderObject* renderer = meterElement()->renderer();
798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return renderer && !RenderTheme::theme().supportsMeter(renderer->style()->appearance()) && HTMLDivElement::rendererIsNeeded(style);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* MeterInnerElement::createRenderer(RenderStyle*)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
84f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return new RenderMeter(this);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)inline MeterBarElement::MeterBarElement(Document& document)
88521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    : MeterShadowElement(document)
89521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
90521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
91521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MeterBarElement> MeterBarElement::create(Document& document)
93521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MeterBarElement> element = adoptRefWillBeNoop(new MeterBarElement(document));
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    element->setShadowPseudoId(AtomicString("-webkit-meter-bar", AtomicString::ConstructFromLiteral));
96521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return element.release();
97521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
98521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)inline MeterValueElement::MeterValueElement(Document& document)
100521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    : MeterShadowElement(document)
101521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
102521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
103521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<MeterValueElement> MeterValueElement::create(Document& document)
105521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<MeterValueElement> element = adoptRefWillBeNoop(new MeterValueElement(document));
107521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    element->updatePseudo();
108521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return element.release();
109521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
110521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const AtomicString& MeterValueElement::valuePseudoId() const
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, optimumPseudoId, ("-webkit-meter-optimum-value", AtomicString::ConstructFromLiteral));
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, suboptimumPseudoId, ("-webkit-meter-suboptimum-value", AtomicString::ConstructFromLiteral));
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, evenLessGoodPseudoId, ("-webkit-meter-even-less-good-value", AtomicString::ConstructFromLiteral));
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLMeterElement* meter = meterElement();
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!meter)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return optimumPseudoId;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (meter->gaugeRegion()) {
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case HTMLMeterElement::GaugeRegionOptimum:
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return optimumPseudoId;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case HTMLMeterElement::GaugeRegionSuboptimal:
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return suboptimumPseudoId;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case HTMLMeterElement::GaugeRegionEvenLessGood:
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return evenLessGoodPseudoId;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return optimumPseudoId;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MeterValueElement::setWidthPercentage(double width)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setInlineStyleProperty(CSSPropertyWidth, width, CSSPrimitiveValue::CSS_PERCENTAGE);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
140