#ifndef HistoryItem_h
#define HistoryItem_h
#include "FloatRect.h"
#include "IntPoint.h"
#include "IntRect.h"
#include "SerializedScriptValue.h"
#include <memory>
#include <wtf/RefCounted.h>
#include <wtf/text/WTFString.h>
#if PLATFORM(IOS)
#include "ViewportArguments.h"
#endif
#if PLATFORM(COCOA)
#import <wtf/RetainPtr.h>
typedef struct objc_object* id;
#endif
namespace WebCore {
class CachedPage;
class Document;
class FormData;
class HistoryItem;
class Image;
class ResourceRequest;
class URL;
enum class PruningReason;
typedef Vector<RefPtr<HistoryItem>> HistoryItemVector;
extern void (*notifyHistoryItemChanged)(HistoryItem*);
class HistoryItem : public RefCounted<HistoryItem> {
friend class PageCache;
public:
static PassRefPtr<HistoryItem> create() { return adoptRef(new HistoryItem); }
static PassRefPtr<HistoryItem> create(const String& urlString, const String& title)
{
return adoptRef(new HistoryItem(urlString, title));
}
static PassRefPtr<HistoryItem> create(const String& urlString, const String& title, const String& alternateTitle)
{
return adoptRef(new HistoryItem(urlString, title, alternateTitle));
}
static PassRefPtr<HistoryItem> create(const URL& url, const String& target, const String& parent, const String& title)
{
return adoptRef(new HistoryItem(url, target, parent, title));
}
~HistoryItem();
PassRefPtr<HistoryItem> copy() const;
void reset();
const String& originalURLString() const;
const String& urlString() const;
const String& title() const;
bool isInPageCache() const { return m_cachedPage.get(); }
bool hasCachedPageExpired() const;
void setAlternateTitle(const String& alternateTitle);
const String& alternateTitle() const;
const String& parent() const;
URL url() const;
URL originalURL() const;
const String& referrer() const;
const String& target() const;
bool isTargetItem() const;
FormData* formData();
String formContentType() const;
bool lastVisitWasFailure() const { return m_lastVisitWasFailure; }
const IntPoint& scrollPoint() const;
void setScrollPoint(const IntPoint&);
void clearScrollPoint();
float pageScaleFactor() const;
void setPageScaleFactor(float);
const Vector<String>& documentState() const;
void setDocumentState(const Vector<String>&);
void clearDocumentState();
void setURL(const URL&);
void setURLString(const String&);
void setOriginalURLString(const String&);
void setReferrer(const String&);
void setTarget(const String&);
void setParent(const String&);
void setTitle(const String&);
void setIsTargetItem(bool);
void setStateObject(PassRefPtr<SerializedScriptValue> object);
PassRefPtr<SerializedScriptValue> stateObject() const { return m_stateObject; }
void setItemSequenceNumber(long long number) { m_itemSequenceNumber = number; }
long long itemSequenceNumber() const { return m_itemSequenceNumber; }
void setDocumentSequenceNumber(long long number) { m_documentSequenceNumber = number; }
long long documentSequenceNumber() const { return m_documentSequenceNumber; }
void setFormInfoFromRequest(const ResourceRequest&);
void setFormData(PassRefPtr<FormData>);
void setFormContentType(const String&);
void setLastVisitWasFailure(bool wasFailure) { m_lastVisitWasFailure = wasFailure; }
void addChildItem(PassRefPtr<HistoryItem>);
void setChildItem(PassRefPtr<HistoryItem>);
HistoryItem* childItemWithTarget(const String&) const;
HistoryItem* childItemWithDocumentSequenceNumber(long long number) const;
HistoryItem* targetItem();
const HistoryItemVector& children() const;
bool hasChildren() const;
void clearChildren();
bool isAncestorOf(const HistoryItem*) const;
bool shouldDoSameDocumentNavigationTo(HistoryItem* otherItem) const;
bool hasSameFrames(HistoryItem* otherItem) const;
void addRedirectURL(const String&);
Vector<String>* redirectURLs() const;
void setRedirectURLs(std::unique_ptr<Vector<String>>);
bool isCurrentDocument(Document*) const;
#if PLATFORM(COCOA)
id viewState() const;
void setViewState(id);
id getTransientProperty(const String&) const;
void setTransientProperty(const String&, id);
#endif
#ifndef NDEBUG
int showTree() const;
int showTreeWithIndent(unsigned indentLevel) const;
#endif
#if PLATFORM(IOS)
FloatRect exposedContentRect() const { return m_exposedContentRect; }
void setExposedContentRect(FloatRect exposedContentRect) { m_exposedContentRect = exposedContentRect; }
IntRect unobscuredContentRect() const { return m_unobscuredContentRect; }
void setUnobscuredContentRect(IntRect unobscuredContentRect) { m_unobscuredContentRect = unobscuredContentRect; }
FloatSize minimumLayoutSizeInScrollViewCoordinates() const { return m_minimumLayoutSizeInScrollViewCoordinates; }
void setMinimumLayoutSizeInScrollViewCoordinates(FloatSize minimumLayoutSizeInScrollViewCoordinates) { m_minimumLayoutSizeInScrollViewCoordinates = minimumLayoutSizeInScrollViewCoordinates; }
IntSize contentSize() const { return m_contentSize; }
void setContentSize(IntSize contentSize) { m_contentSize = contentSize; }
float scale() const { return m_scale; }
bool scaleIsInitial() const { return m_scaleIsInitial; }
void setScaleIsInitial(bool scaleIsInitial) { m_scaleIsInitial = scaleIsInitial; }
void setScale(float newScale, bool isInitial)
{
m_scale = newScale;
m_scaleIsInitial = isInitial;
}
const ViewportArguments& viewportArguments() const { return m_viewportArguments; }
void setViewportArguments(const ViewportArguments& viewportArguments) { m_viewportArguments = viewportArguments; }
uint32_t bookmarkID() const { return m_bookmarkID; }
void setBookmarkID(uint32_t bookmarkID) { m_bookmarkID = bookmarkID; }
String sharedLinkUniqueIdentifier() const { return m_sharedLinkUniqueIdentifier; }
void setSharedLinkUniqueIdentifier(const String& sharedLinkUniqueidentifier) { m_sharedLinkUniqueIdentifier = sharedLinkUniqueidentifier; }
#endif
private:
HistoryItem();
HistoryItem(const String& urlString, const String& title);
HistoryItem(const String& urlString, const String& title, const String& alternateTitle);
HistoryItem(const URL& url, const String& frameName, const String& parent, const String& title);
explicit HistoryItem(const HistoryItem&);
bool hasSameDocumentTree(HistoryItem* otherItem) const;
HistoryItem* findTargetItem();
String m_urlString;
String m_originalURLString;
String m_referrer;
String m_target;
String m_parent;
String m_title;
String m_displayTitle;
IntPoint m_scrollPoint;
float m_pageScaleFactor;
Vector<String> m_documentState;
HistoryItemVector m_children;
bool m_lastVisitWasFailure;
bool m_isTargetItem;
std::unique_ptr<Vector<String>> m_redirectURLs;
int64_t m_itemSequenceNumber;
int64_t m_documentSequenceNumber;
RefPtr<SerializedScriptValue> m_stateObject;
RefPtr<FormData> m_formData;
String m_formContentType;
HistoryItem* m_next;
HistoryItem* m_prev;
std::unique_ptr<CachedPage> m_cachedPage;
PruningReason m_pruningReason;
#if PLATFORM(IOS)
FloatRect m_exposedContentRect;
IntRect m_unobscuredContentRect;
FloatSize m_minimumLayoutSizeInScrollViewCoordinates;
IntSize m_contentSize;
float m_scale;
bool m_scaleIsInitial;
ViewportArguments m_viewportArguments;
uint32_t m_bookmarkID;
String m_sharedLinkUniqueIdentifier;
#endif
#if PLATFORM(COCOA)
RetainPtr<id> m_viewState;
std::unique_ptr<HashMap<String, RetainPtr<id>>> m_transientProperties;
#endif
};
}
#ifndef NDEBUG
extern "C" int showTree(const WebCore::HistoryItem*);
#endif
#endif // HISTORYITEM_H