Fix for 3710721 and 3504114, crashes because of bad ownership model for list markers.
[WebKit-https.git] / WebCore / khtml / rendering / render_list.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  * Copyright (C) 2003 Apple Computer, Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  *
23  */
24 #ifndef RENDER_LIST_H
25 #define RENDER_LIST_H
26
27 #include "render_block.h"
28
29 // ### list-style-position, list-style-image is still missing
30
31 namespace khtml
32 {
33
34 class RenderListItem;
35
36 /* used to render the lists marker.
37      This class always has to be a direct child of a RenderListItem!
38 */
39 class RenderListMarker : public RenderBox
40 {
41 public:
42     RenderListMarker(DOM::DocumentImpl* document);
43     ~RenderListMarker();
44
45     virtual void setStyle(RenderStyle *style);
46
47     virtual const char *renderName() const { return "RenderListMarker"; }
48     // so the marker gets to layout itself. Only needed for
49     // list-style-position: inside
50
51     virtual void paint(PaintInfo& i, int xoff, int yoff);
52     virtual void layout( );
53     virtual void calcMinMaxWidth();
54
55     virtual void setPixmap( const QPixmap &, const QRect&, CachedImage *);
56
57     virtual void calcWidth();
58
59     virtual short lineHeight(bool b, bool isRootLineBox=false) const;
60     virtual short baselinePosition(bool b, bool isRootLineBox=false) const;
61     
62     virtual bool isListMarker() const { return true; }
63
64     CachedImage* listImage() const { return m_listImage; }
65     
66     RenderListItem* listItem() { return m_listItem; }
67     void setListItem(RenderListItem* listItem) { m_listItem = listItem; }
68     
69     const QString& text() const { return m_item; }
70
71 protected:
72     friend class RenderListItem;
73     
74     bool isInside() const;
75
76     QString m_item;
77     CachedImage *m_listImage;
78     long m_value;
79     RenderListItem* m_listItem;
80 };
81
82 class RenderListItem : public RenderBlock
83 {
84 public:
85     RenderListItem(DOM::NodeImpl*);
86     virtual ~RenderListItem();
87     
88     virtual void detach();
89
90     virtual const char *renderName() const { return "RenderListItem"; }
91
92     virtual void setStyle(RenderStyle *style);
93
94     virtual bool isListItem() const { return true; }
95     
96     long value() const { return m_marker->m_value; }
97     void setValue( long v ) { predefVal = v; }
98     void calcListValue();
99     
100     virtual void paint(PaintInfo& i, int xoff, int yoff);
101
102     virtual void layout( );
103     virtual void calcMinMaxWidth();
104
105     virtual QRect getAbsoluteRepaintRect();
106     
107     void updateMarkerLocation();
108     
109     void setNotInList(bool notInList) { _notInList = notInList; }
110     bool notInList() const { return _notInList; }
111
112 #if APPLE_CHANGES
113     QString markerStringValue() { if (m_marker) return m_marker->m_item; return ""; }
114 #endif
115
116 protected:
117     long int predefVal;
118     RenderListMarker *m_marker;
119     bool _notInList;
120 };
121
122 }; //namespace
123
124 #endif