Home | History | Annotate | Download | only in history
      1 /*
      2  * Copyright (C) 2006, 2008 Apple 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 "IntPoint.h"
     30 #include "PlatformString.h"
     31 #include "SerializedScriptValue.h"
     32 #include <wtf/OwnPtr.h>
     33 #include <wtf/PassOwnPtr.h>
     34 
     35 #if PLATFORM(MAC)
     36 #import <wtf/RetainPtr.h>
     37 typedef struct objc_object* id;
     38 #endif
     39 
     40 #if PLATFORM(QT)
     41 #include <QVariant>
     42 #include <QByteArray>
     43 #include <QDataStream>
     44 #endif
     45 
     46 #if PLATFORM(ANDROID)
     47 #include "AndroidWebHistoryBridge.h"
     48 #endif
     49 
     50 namespace WebCore {
     51 
     52 class CachedPage;
     53 class Document;
     54 class FormData;
     55 class HistoryItem;
     56 class Image;
     57 class KURL;
     58 class ResourceRequest;
     59 
     60 typedef Vector<RefPtr<HistoryItem> > HistoryItemVector;
     61 
     62 extern void (*notifyHistoryItemChanged)(HistoryItem*);
     63 
     64 enum VisitCountBehavior {
     65     IncreaseVisitCount,
     66     DoNotIncreaseVisitCount
     67 };
     68 
     69 class HistoryItem : public RefCounted<HistoryItem> {
     70     friend class PageCache;
     71 
     72 public:
     73     static PassRefPtr<HistoryItem> create() { return adoptRef(new HistoryItem); }
     74     static PassRefPtr<HistoryItem> create(const String& urlString, const String& title, double lastVisited)
     75     {
     76         return adoptRef(new HistoryItem(urlString, title, lastVisited));
     77     }
     78     static PassRefPtr<HistoryItem> create(const String& urlString, const String& title, const String& alternateTitle, double lastVisited)
     79     {
     80         return adoptRef(new HistoryItem(urlString, title, alternateTitle, lastVisited));
     81     }
     82     static PassRefPtr<HistoryItem> create(const KURL& url, const String& target, const String& parent, const String& title)
     83     {
     84         return adoptRef(new HistoryItem(url, target, parent, title));
     85     }
     86 
     87     ~HistoryItem();
     88 
     89     PassRefPtr<HistoryItem> copy() const;
     90 
     91     const String& originalURLString() const;
     92     const String& urlString() const;
     93     const String& title() const;
     94 
     95     bool isInPageCache() const { return m_cachedPage; }
     96 
     97     double lastVisitedTime() const;
     98 
     99     void setAlternateTitle(const String& alternateTitle);
    100     const String& alternateTitle() const;
    101 
    102     Image* icon() const;
    103 
    104     const String& parent() const;
    105     KURL url() const;
    106     KURL originalURL() const;
    107     const String& referrer() const;
    108     const String& target() const;
    109     bool isTargetItem() const;
    110 
    111     FormData* formData();
    112     String formContentType() const;
    113 
    114     int visitCount() const;
    115     bool lastVisitWasFailure() const { return m_lastVisitWasFailure; }
    116     bool lastVisitWasHTTPNonGet() const { return m_lastVisitWasHTTPNonGet; }
    117 
    118     void mergeAutoCompleteHints(HistoryItem* otherItem);
    119 
    120     const IntPoint& scrollPoint() const;
    121     void setScrollPoint(const IntPoint&);
    122     void clearScrollPoint();
    123     const Vector<String>& documentState() const;
    124     void setDocumentState(const Vector<String>&);
    125     void clearDocumentState();
    126 
    127     void setURL(const KURL&);
    128     void setURLString(const String&);
    129     void setOriginalURLString(const String&);
    130     void setReferrer(const String&);
    131     void setTarget(const String&);
    132     void setParent(const String&);
    133     void setTitle(const String&);
    134     void setIsTargetItem(bool);
    135 
    136     void setStateObject(PassRefPtr<SerializedScriptValue> object);
    137     SerializedScriptValue* stateObject() const { return m_stateObject.get(); }
    138 
    139     void setDocumentSequenceNumber(long long number) { m_documentSequenceNumber = number; }
    140     long long documentSequenceNumber() const { return m_documentSequenceNumber; }
    141 
    142     void setFormInfoFromRequest(const ResourceRequest&);
    143     void setFormData(PassRefPtr<FormData>);
    144     void setFormContentType(const String&);
    145 
    146     void recordInitialVisit();
    147 
    148     void setVisitCount(int);
    149     void setLastVisitWasFailure(bool wasFailure) { m_lastVisitWasFailure = wasFailure; }
    150     void setLastVisitWasHTTPNonGet(bool wasNotGet) { m_lastVisitWasHTTPNonGet = wasNotGet; }
    151 
    152     void addChildItem(PassRefPtr<HistoryItem>);
    153     void setChildItem(PassRefPtr<HistoryItem>);
    154     HistoryItem* childItemWithTarget(const String&) const;
    155     HistoryItem* targetItem();
    156     const HistoryItemVector& children() const;
    157     bool hasChildren() const;
    158     void clearChildren();
    159 
    160     // This should not be called directly for HistoryItems that are already included
    161     // in GlobalHistory. The WebKit api for this is to use -[WebHistory setLastVisitedTimeInterval:forItem:] instead.
    162     void setLastVisitedTime(double);
    163     void visited(const String& title, double time, VisitCountBehavior);
    164 
    165     void addRedirectURL(const String&);
    166     Vector<String>* redirectURLs() const;
    167     void setRedirectURLs(PassOwnPtr<Vector<String> >);
    168 
    169     bool isCurrentDocument(Document*) const;
    170 
    171 #if PLATFORM(MAC)
    172     id viewState() const;
    173     void setViewState(id);
    174 
    175     // Transient properties may be of any ObjC type.  They are intended to be used to store state per back/forward list entry.
    176     // The properties will not be persisted; when the history item is removed, the properties will be lost.
    177     id getTransientProperty(const String&) const;
    178     void setTransientProperty(const String&, id);
    179 #endif
    180 
    181 #if PLATFORM(QT)
    182     QVariant userData() const { return m_userData; }
    183     void setUserData(const QVariant& userData) { m_userData = userData; }
    184 
    185     bool restoreState(QDataStream& buffer, int version);
    186     QDataStream& saveState(QDataStream& out, int version) const;
    187 #endif
    188 
    189 #if PLATFORM(ANDROID)
    190     void setBridge(AndroidWebHistoryBridge* bridge);
    191     AndroidWebHistoryBridge* bridge() const;
    192 #endif
    193 
    194 #ifndef NDEBUG
    195     int showTree() const;
    196     int showTreeWithIndent(unsigned indentLevel) const;
    197 #endif
    198 
    199     void adoptVisitCounts(Vector<int>& dailyCounts, Vector<int>& weeklyCounts);
    200     const Vector<int>& dailyVisitCounts() const { return m_dailyVisitCounts; }
    201     const Vector<int>& weeklyVisitCounts() const { return m_weeklyVisitCounts; }
    202 
    203 private:
    204     HistoryItem();
    205     HistoryItem(const String& urlString, const String& title, double lastVisited);
    206     HistoryItem(const String& urlString, const String& title, const String& alternateTitle, double lastVisited);
    207     HistoryItem(const KURL& url, const String& frameName, const String& parent, const String& title);
    208 
    209     HistoryItem(const HistoryItem&);
    210 
    211     void padDailyCountsForNewVisit(double time);
    212     void collapseDailyVisitsToWeekly();
    213     void recordVisitAtTime(double, VisitCountBehavior = IncreaseVisitCount);
    214 
    215     HistoryItem* findTargetItem();
    216 
    217     /* When adding new member variables to this class, please notify the Qt team.
    218      * qt/HistoryItemQt.cpp contains code to serialize history items.
    219      */
    220 
    221     String m_urlString;
    222     String m_originalURLString;
    223     String m_referrer;
    224     String m_target;
    225     String m_parent;
    226     String m_title;
    227     String m_displayTitle;
    228 
    229     double m_lastVisitedTime;
    230     bool m_lastVisitWasHTTPNonGet;
    231 
    232     IntPoint m_scrollPoint;
    233     Vector<String> m_documentState;
    234 
    235     HistoryItemVector m_children;
    236 
    237     bool m_lastVisitWasFailure;
    238     bool m_isTargetItem;
    239     int m_visitCount;
    240     Vector<int> m_dailyVisitCounts;
    241     Vector<int> m_weeklyVisitCounts;
    242 
    243     OwnPtr<Vector<String> > m_redirectURLs;
    244 
    245     // Support for HTML5 History
    246     RefPtr<SerializedScriptValue> m_stateObject;
    247     long long m_documentSequenceNumber;
    248 
    249     // info used to repost form data
    250     RefPtr<FormData> m_formData;
    251     String m_formContentType;
    252 
    253     // PageCache controls these fields.
    254     HistoryItem* m_next;
    255     HistoryItem* m_prev;
    256     RefPtr<CachedPage> m_cachedPage;
    257 
    258 #if PLATFORM(MAC)
    259     RetainPtr<id> m_viewState;
    260     OwnPtr<HashMap<String, RetainPtr<id> > > m_transientProperties;
    261 #endif
    262 
    263 #if PLATFORM(QT)
    264     QVariant m_userData;
    265 #endif
    266 
    267 #if PLATFORM(ANDROID)
    268     RefPtr<AndroidWebHistoryBridge> m_bridge;
    269 #endif
    270 
    271 }; //class HistoryItem
    272 
    273 } //namespace WebCore
    274 
    275 #ifndef NDEBUG
    276 // Outside the WebCore namespace for ease of invocation from gdb.
    277 extern "C" int showTree(const WebCore::HistoryItem*);
    278 #endif
    279 
    280 #endif // HISTORYITEM_H
    281