WebCore:
[WebKit-https.git] / WebCore / history / HistoryItem.h
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef HistoryItem_h
27 #define HistoryItem_h
28
29 #include "CachedPage.h"
30 #include "FormData.h"
31 #include "IntPoint.h"
32 #include "KURL.h"
33 #include "PlatformString.h"
34 #include <wtf/RefCounted.h>
35 #include "StringHash.h"
36 #include "SubstituteData.h"
37 #include <wtf/HashMap.h>
38 #include <wtf/OwnPtr.h>
39 #include <wtf/RefPtr.h>
40 #include <wtf/Vector.h>
41
42 #if PLATFORM(MAC)
43 #import <wtf/RetainPtr.h>
44 typedef struct objc_object* id;
45 #endif
46
47 namespace WebCore {
48
49 class Document;
50 class Image;
51 class KURL;
52 struct ResourceRequest;
53
54 class HistoryItem;
55 typedef Vector<RefPtr<HistoryItem> > HistoryItemVector;
56
57 extern void (*notifyHistoryItemChanged)();
58
59 class HistoryItem : public RefCounted<HistoryItem> {
60     friend class PageCache;
61
62 public: 
63     HistoryItem();
64     HistoryItem(const String& urlString, const String& title, double lastVisited);
65     HistoryItem(const String& urlString, const String& title, const String& alternateTitle, double lastVisited);
66     HistoryItem(const KURL& url, const String& title);
67     HistoryItem(const KURL& url, const String& target, const String& parent, const String& title);
68     
69     ~HistoryItem();
70     
71     PassRefPtr<HistoryItem> copy() const;
72     
73     const String& originalURLString() const;
74     const String& urlString() const;
75     const String& title() const;
76     
77     void setInPageCache(bool inPageCache) { m_isInPageCache = inPageCache; }
78     bool isInPageCache() const { return m_isInPageCache; }
79     
80     double lastVisitedTime() const;
81     
82     void setAlternateTitle(const String& alternateTitle);
83     const String& alternateTitle() const;
84     
85     Image* icon() const;
86     
87     const String& parent() const;
88     KURL url() const;
89     KURL originalURL() const;
90     const String& target() const;
91     bool isTargetItem() const;
92     
93     FormData* formData();
94     String formContentType() const;
95     String formReferrer() const;
96     String rssFeedReferrer() const;
97     const SubstituteData& substituteData() const;
98     
99     int visitCount() const;
100
101     void mergeAutoCompleteHints(HistoryItem* otherItem);
102     
103     const IntPoint& scrollPoint() const;
104     void setScrollPoint(const IntPoint&);
105     void clearScrollPoint();
106     const Vector<String>& documentState() const;
107     void setDocumentState(const Vector<String>&);
108     void clearDocumentState();
109
110     void setURL(const KURL&);
111     void setURLString(const String&);
112     void setOriginalURLString(const String&);
113     void setTarget(const String&);
114     void setParent(const String&);
115     void setTitle(const String&);
116     void setIsTargetItem(bool);
117     
118     void setFormInfoFromRequest(const ResourceRequest&);
119
120     void setRSSFeedReferrer(const String&);
121     void setVisitCount(int);
122     void setSubstituteData(const SubstituteData&);
123
124     void addChildItem(PassRefPtr<HistoryItem>);
125     HistoryItem* childItemWithName(const String&) const;
126     HistoryItem* targetItem();
127     HistoryItem* recurseToFindTargetItem();
128     const HistoryItemVector& children() const;
129     bool hasChildren() const;
130
131     // This should not be called directly for HistoryItems that are already included
132     // in GlobalHistory. The WebKit api for this is to use -[WebHistory setLastVisitedTimeInterval:forItem:] instead.
133     void setLastVisitedTime(double);
134     
135     bool isCurrentDocument(Document*) const;
136     
137 #if PLATFORM(MAC)
138     id viewState() const;
139     void setViewState(id);
140     
141     // Transient properties may be of any ObjC type.  They are intended to be used to store state per back/forward list entry.
142     // The properties will not be persisted; when the history item is removed, the properties will be lost.
143     id getTransientProperty(const String&) const;
144     void setTransientProperty(const String&, id);
145 #endif
146
147 #ifndef NDEBUG
148     int showTree() const;
149     int showTreeWithIndent(unsigned indentLevel) const;
150 #endif
151
152 private:
153     HistoryItem(const HistoryItem&);
154     
155     String m_urlString;
156     String m_originalURLString;
157     String m_target;
158     String m_parent;
159     String m_title;
160     String m_displayTitle;
161     
162     double m_lastVisitedTime;
163
164     IntPoint m_scrollPoint;
165     Vector<String> m_documentState;
166     
167     HistoryItemVector m_subItems;
168     
169     bool m_isInPageCache;
170     bool m_isTargetItem;
171     int m_visitCount;
172     
173     // info used to repost form data
174     RefPtr<FormData> m_formData;
175     String m_formContentType;
176     String m_formReferrer;
177     
178     // info used to support RSS feeds
179     String m_rssFeedReferrer;
180
181     SubstituteData m_substituteData;
182
183     // PageCache controls these fields.
184     HistoryItem* m_next;
185     HistoryItem* m_prev;
186     RefPtr<CachedPage> m_cachedPage;
187     
188 #if PLATFORM(MAC)
189     RetainPtr<id> m_viewState;
190     OwnPtr<HashMap<String, RetainPtr<id> > > m_transientProperties;
191 #endif
192 }; //class HistoryItem
193
194 } //namespace WebCore
195
196 #ifndef NDEBUG
197 // Outside the WebCore namespace for ease of invocation from gdb.
198 extern "C" int showTree(const WebCore::HistoryItem*);
199 #endif
200
201 #endif // HISTORYITEM_H