Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright (C) 2005 Apple Computer
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Library General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * Library General Public License for more details.
     13  *
     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
     16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17  * Boston, MA 02110-1301, USA.
     18  *
     19  */
     20 
     21 #ifndef RenderButton_h
     22 #define RenderButton_h
     23 
     24 #include "HTMLNames.h"
     25 #include "core/rendering/RenderFlexibleBox.h"
     26 
     27 namespace WebCore {
     28 
     29 class RenderTextFragment;
     30 
     31 // RenderButtons are just like normal flexboxes except that they will generate an anonymous block child.
     32 // For inputs, they will also generate an anonymous RenderText and keep its style and content up
     33 // to date as the button changes.
     34 class RenderButton FINAL : public RenderFlexibleBox {
     35 public:
     36     explicit RenderButton(Element*);
     37     virtual ~RenderButton();
     38 
     39     virtual const char* renderName() const { return "RenderButton"; }
     40     virtual bool isRenderButton() const { return true; }
     41 
     42     virtual bool canBeSelectionLeaf() const OVERRIDE { return node() && node()->rendererIsEditable(); }
     43 
     44     virtual void addChild(RenderObject* newChild, RenderObject *beforeChild = 0);
     45     virtual void removeChild(RenderObject*);
     46     virtual void removeLeftoverAnonymousBlock(RenderBlock*) { }
     47     virtual bool createsAnonymousWrapper() const { return true; }
     48 
     49     void setupInnerStyle(RenderStyle*);
     50 
     51     // <button> should allow whitespace even though RenderFlexibleBox doesn't.
     52     virtual bool canHaveWhitespaceChildren() const OVERRIDE { return true; }
     53 
     54     virtual bool canHaveGeneratedChildren() const OVERRIDE;
     55     virtual bool hasControlClip() const { return true; }
     56     virtual LayoutRect controlClipRect(const LayoutPoint&) const;
     57 
     58     virtual int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode) const OVERRIDE;
     59 
     60 private:
     61     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
     62     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     63 
     64     virtual bool hasLineIfEmpty() const { return node() && node()->hasTagName(HTMLNames::inputTag); }
     65 
     66     virtual bool requiresForcedStyleRecalcPropagation() const { return true; }
     67 
     68     RenderBlock* m_inner;
     69 };
     70 
     71 inline RenderButton* toRenderButton(RenderObject* object)
     72 {
     73     ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderButton());
     74     return static_cast<RenderButton*>(object);
     75 }
     76 
     77 inline const RenderButton* toRenderButton(const RenderObject* object)
     78 {
     79     ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderButton());
     80     return static_cast<const RenderButton*>(object);
     81 }
     82 
     83 // This will catch anyone doing an unnecessary cast.
     84 void toRenderButton(const RenderButton*);
     85 
     86 } // namespace WebCore
     87 
     88 #endif // RenderButton_h
     89