Home | History | Annotate | Download | only in html
      1 /*
      2  * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org)
      3  *           (C) 1999 Antti Koivisto (koivisto (at) kde.org)
      4  * Copyright (C) 2003, 2007, 2010 Apple Inc. All rights reserved.
      5  *
      6  * This library is free software; you can redistribute it and/or
      7  * modify it under the terms of the GNU Library General Public
      8  * License as published by the Free Software Foundation; either
      9  * version 2 of the License, or (at your option) any later version.
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Library General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU Library General Public License
     17  * along with this library; see the file COPYING.LIB.  If not, write to
     18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     19  * Boston, MA 02110-1301, USA.
     20  *
     21  */
     22 
     23 #include "config.h"
     24 #include "core/html/HTMLMarqueeElement.h"
     25 
     26 #include "bindings/core/v8/ExceptionState.h"
     27 #include "core/CSSPropertyNames.h"
     28 #include "core/CSSValueKeywords.h"
     29 #include "core/HTMLNames.h"
     30 #include "core/dom/ExceptionCode.h"
     31 #include "core/rendering/RenderMarquee.h"
     32 
     33 namespace blink {
     34 
     35 using namespace HTMLNames;
     36 
     37 inline HTMLMarqueeElement::HTMLMarqueeElement(Document& document)
     38     : HTMLElement(marqueeTag, document)
     39     , ActiveDOMObject(&document)
     40 {
     41 }
     42 
     43 PassRefPtrWillBeRawPtr<HTMLMarqueeElement> HTMLMarqueeElement::create(Document& document)
     44 {
     45     RefPtrWillBeRawPtr<HTMLMarqueeElement> marqueeElement(adoptRefWillBeNoop(new HTMLMarqueeElement(document)));
     46     marqueeElement->suspendIfNeeded();
     47     return marqueeElement.release();
     48 }
     49 
     50 int HTMLMarqueeElement::minimumDelay() const
     51 {
     52     if (fastGetAttribute(truespeedAttr).isEmpty()) {
     53         // WinIE uses 60ms as the minimum delay by default.
     54         return 60;
     55     }
     56     return 0;
     57 }
     58 
     59 void HTMLMarqueeElement::didMoveToNewDocument(Document& oldDocument)
     60 {
     61     ActiveDOMObject::didMoveToNewExecutionContext(&document());
     62     HTMLElement::didMoveToNewDocument(oldDocument);
     63 }
     64 
     65 bool HTMLMarqueeElement::isPresentationAttribute(const QualifiedName& name) const
     66 {
     67     if (name == widthAttr || name == heightAttr || name == bgcolorAttr || name == vspaceAttr || name == hspaceAttr || name == scrollamountAttr || name == scrolldelayAttr || name == loopAttr || name == behaviorAttr || name == directionAttr)
     68         return true;
     69     return HTMLElement::isPresentationAttribute(name);
     70 }
     71 
     72 void HTMLMarqueeElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
     73 {
     74     if (name == widthAttr) {
     75         if (!value.isEmpty())
     76             addHTMLLengthToStyle(style, CSSPropertyWidth, value);
     77     } else if (name == heightAttr) {
     78         if (!value.isEmpty())
     79             addHTMLLengthToStyle(style, CSSPropertyHeight, value);
     80     } else if (name == bgcolorAttr) {
     81         if (!value.isEmpty())
     82             addHTMLColorToStyle(style, CSSPropertyBackgroundColor, value);
     83     } else if (name == vspaceAttr) {
     84         if (!value.isEmpty()) {
     85             addHTMLLengthToStyle(style, CSSPropertyMarginTop, value);
     86             addHTMLLengthToStyle(style, CSSPropertyMarginBottom, value);
     87         }
     88     } else if (name == hspaceAttr) {
     89         if (!value.isEmpty()) {
     90             addHTMLLengthToStyle(style, CSSPropertyMarginLeft, value);
     91             addHTMLLengthToStyle(style, CSSPropertyMarginRight, value);
     92         }
     93     } else if (name == scrollamountAttr) {
     94         if (!value.isEmpty())
     95             addHTMLLengthToStyle(style, CSSPropertyInternalMarqueeIncrement, value);
     96     } else if (name == scrolldelayAttr) {
     97         if (!value.isEmpty())
     98             addHTMLLengthToStyle(style, CSSPropertyInternalMarqueeSpeed, value);
     99     } else if (name == loopAttr) {
    100         if (!value.isEmpty()) {
    101             if (value == "-1" || equalIgnoringCase(value, "infinite"))
    102                 addPropertyToPresentationAttributeStyle(style, CSSPropertyInternalMarqueeRepetition, CSSValueInfinite);
    103             else
    104                 addHTMLLengthToStyle(style, CSSPropertyInternalMarqueeRepetition, value);
    105         }
    106     } else if (name == behaviorAttr) {
    107         if (!value.isEmpty())
    108             addPropertyToPresentationAttributeStyle(style, CSSPropertyInternalMarqueeStyle, value);
    109     } else if (name == directionAttr) {
    110         if (!value.isEmpty())
    111             addPropertyToPresentationAttributeStyle(style, CSSPropertyInternalMarqueeDirection, value);
    112     } else
    113         HTMLElement::collectStyleForPresentationAttribute(name, value, style);
    114 }
    115 
    116 void HTMLMarqueeElement::start()
    117 {
    118     if (RenderMarquee* marqueeRenderer = renderMarquee())
    119         marqueeRenderer->start();
    120 }
    121 
    122 void HTMLMarqueeElement::stop()
    123 {
    124     if (RenderMarquee* marqueeRenderer = renderMarquee())
    125         marqueeRenderer->stop();
    126 }
    127 
    128 void HTMLMarqueeElement::suspend()
    129 {
    130     if (RenderMarquee* marqueeRenderer = renderMarquee())
    131         marqueeRenderer->suspend();
    132 }
    133 
    134 void HTMLMarqueeElement::resume()
    135 {
    136     if (RenderMarquee* marqueeRenderer = renderMarquee())
    137         marqueeRenderer->updateMarqueePosition();
    138 }
    139 
    140 RenderMarquee* HTMLMarqueeElement::renderMarquee() const
    141 {
    142     if (renderer() && renderer()->isMarquee())
    143         return toRenderMarquee(renderer());
    144     return 0;
    145 }
    146 
    147 RenderObject* HTMLMarqueeElement::createRenderer(RenderStyle*)
    148 {
    149     return new RenderMarquee(this);
    150 }
    151 
    152 void HTMLMarqueeElement::timerFired(Timer<HTMLMarqueeElement>*)
    153 {
    154     if (!renderer())
    155         return;
    156 
    157     document().updateLayout();
    158 
    159     // The updateLayout() could have destroyed renderer(), so this re-check is very important.
    160     if (renderer())
    161         toRenderMarquee(renderer())->timerFired();
    162 }
    163 
    164 } // namespace blink
    165