Switch remaining users of Document::inPageCache() to pageCacheState()
[WebKit-https.git] / Source / WebCore / history / HistoryItem.cpp
index 550ed91..c82f159 100644 (file)
@@ -53,7 +53,7 @@ static void defaultNotifyHistoryItemChanged(HistoryItem*)
 {
 }
 
-void (*notifyHistoryItemChanged)(HistoryItem*) = defaultNotifyHistoryItemChanged;
+WEBCORE_EXPORT void (*notifyHistoryItemChanged)(HistoryItem*) = defaultNotifyHistoryItemChanged;
 
 HistoryItem::HistoryItem()
     : m_pageScaleFactor(0)
@@ -61,13 +61,7 @@ HistoryItem::HistoryItem()
     , m_isTargetItem(false)
     , m_itemSequenceNumber(generateSequenceNumber())
     , m_documentSequenceNumber(generateSequenceNumber())
-    , m_next(0)
-    , m_prev(0)
-#if PLATFORM(IOS)
-    , m_scale(0)
-    , m_scaleIsInitial(false)
-    , m_bookmarkID(0)
-#endif
+    , m_pruningReason(PruningReason::None)
 {
 }
 
@@ -80,14 +74,8 @@ HistoryItem::HistoryItem(const String& urlString, const String& title)
     , m_isTargetItem(false)
     , m_itemSequenceNumber(generateSequenceNumber())
     , m_documentSequenceNumber(generateSequenceNumber())
-    , m_next(0)
-    , m_prev(0)
-#if PLATFORM(IOS)
-    , m_scale(0)
-    , m_scaleIsInitial(false)
-    , m_bookmarkID(0)
-#endif
-{    
+    , m_pruningReason(PruningReason::None)
+{
     iconDatabase().retainIconForPageURL(m_urlString);
 }
 
@@ -101,39 +89,11 @@ HistoryItem::HistoryItem(const String& urlString, const String& title, const Str
     , m_isTargetItem(false)
     , m_itemSequenceNumber(generateSequenceNumber())
     , m_documentSequenceNumber(generateSequenceNumber())
-    , m_next(0)
-    , m_prev(0)
-#if PLATFORM(IOS)
-    , m_scale(0)
-    , m_scaleIsInitial(false)
-    , m_bookmarkID(0)
-#endif
+    , m_pruningReason(PruningReason::None)
 {
     iconDatabase().retainIconForPageURL(m_urlString);
 }
 
-HistoryItem::HistoryItem(const URL& url, const String& target, const String& parent, const String& title)
-    : m_urlString(url.string())
-    , m_originalURLString(url.string())
-    , m_target(target)
-    , m_parent(parent)
-    , m_title(title)
-    , m_pageScaleFactor(0)
-    , m_lastVisitWasFailure(false)
-    , m_isTargetItem(false)
-    , m_itemSequenceNumber(generateSequenceNumber())
-    , m_documentSequenceNumber(generateSequenceNumber())
-    , m_next(0)
-    , m_prev(0)
-#if PLATFORM(IOS)
-    , m_scale(0)
-    , m_scaleIsInitial(false)
-    , m_bookmarkID(0)
-#endif
-{    
-    iconDatabase().retainIconForPageURL(m_urlString);
-}
-
 HistoryItem::~HistoryItem()
 {
     ASSERT(!m_cachedPage);
@@ -146,17 +106,18 @@ inline HistoryItem::HistoryItem(const HistoryItem& item)
     , m_originalURLString(item.m_originalURLString)
     , m_referrer(item.m_referrer)
     , m_target(item.m_target)
-    , m_parent(item.m_parent)
     , m_title(item.m_title)
     , m_displayTitle(item.m_displayTitle)
-    , m_scrollPoint(item.m_scrollPoint)
+    , m_scrollPosition(item.m_scrollPosition)
     , m_pageScaleFactor(item.m_pageScaleFactor)
     , m_lastVisitWasFailure(item.m_lastVisitWasFailure)
     , m_isTargetItem(item.m_isTargetItem)
     , m_itemSequenceNumber(item.m_itemSequenceNumber)
     , m_documentSequenceNumber(item.m_documentSequenceNumber)
     , m_formContentType(item.m_formContentType)
+    , m_pruningReason(PruningReason::None)
 #if PLATFORM(IOS)
+    , m_obscuredInset(item.m_obscuredInset)
     , m_scale(item.m_scale)
     , m_scaleIsInitial(item.m_scaleIsInitial)
     , m_bookmarkID(item.m_bookmarkID)
@@ -175,9 +136,9 @@ inline HistoryItem::HistoryItem(const HistoryItem& item)
         m_redirectURLs = std::make_unique<Vector<String>>(*item.m_redirectURLs);
 }
 
-PassRefPtr<HistoryItem> HistoryItem::copy() const
+Ref<HistoryItem> HistoryItem::copy() const
 {
-    return adoptRef(new HistoryItem(*this));
+    return adoptRef(*new HistoryItem(*this));
 }
 
 void HistoryItem::reset()
@@ -188,7 +149,6 @@ void HistoryItem::reset()
     m_originalURLString = String();
     m_referrer = String();
     m_target = String();
-    m_parent = String();
     m_title = String();
     m_displayTitle = String();
 
@@ -199,10 +159,10 @@ void HistoryItem::reset()
 
     m_itemSequenceNumber = generateSequenceNumber();
 
-    m_stateObject = 0;
+    m_stateObject = nullptr;
     m_documentSequenceNumber = generateSequenceNumber();
 
-    m_formData = 0;
+    m_formData = nullptr;
     m_formContentType = String();
 
     clearChildren();
@@ -255,11 +215,6 @@ const String& HistoryItem::target() const
     return m_target;
 }
 
-const String& HistoryItem::parent() const
-{
-    return m_parent;
-}
-
 void HistoryItem::setAlternateTitle(const String& alternateTitle)
 {
     m_displayTitle = alternateTitle;
@@ -279,7 +234,7 @@ void HistoryItem::setURLString(const String& urlString)
 
 void HistoryItem::setURL(const URL& url)
 {
-    pageCache()->remove(this);
+    PageCache::singleton().remove(*this);
     setURLString(url.string());
     clearDocumentState();
 }
@@ -308,25 +263,19 @@ void HistoryItem::setTarget(const String& target)
     notifyHistoryItemChanged(this);
 }
 
-void HistoryItem::setParent(const String& parent)
+const IntPoint& HistoryItem::scrollPosition() const
 {
-    m_parent = parent;
+    return m_scrollPosition;
 }
 
-const IntPoint& HistoryItem::scrollPoint() const
+void HistoryItem::setScrollPosition(const IntPoint& position)
 {
-    return m_scrollPoint;
+    m_scrollPosition = position;
 }
 
-void HistoryItem::setScrollPoint(const IntPoint& point)
+void HistoryItem::clearScrollPosition()
 {
-    m_scrollPoint = point;
-}
-
-void HistoryItem::clearScrollPoint()
-{
-    m_scrollPoint.setX(0);
-    m_scrollPoint.setY(0);
+    m_scrollPosition = IntPoint();
 }
 
 float HistoryItem::pageScaleFactor() const
@@ -354,6 +303,16 @@ void HistoryItem::clearDocumentState()
     m_documentState.clear();
 }
 
+void HistoryItem::setShouldOpenExternalURLsPolicy(ShouldOpenExternalURLsPolicy policy)
+{
+    m_shouldOpenExternalURLsPolicy = policy;
+}
+
+ShouldOpenExternalURLsPolicy HistoryItem::shouldOpenExternalURLsPolicy() const
+{
+    return m_shouldOpenExternalURLsPolicy;
+}
+
 bool HistoryItem::isTargetItem() const
 {
     return m_isTargetItem;
@@ -364,68 +323,49 @@ void HistoryItem::setIsTargetItem(bool flag)
     m_isTargetItem = flag;
 }
 
-void HistoryItem::setStateObject(PassRefPtr<SerializedScriptValue> object)
+void HistoryItem::setStateObject(RefPtr<SerializedScriptValue>&& object)
 {
-    m_stateObject = object;
+    m_stateObject = WTFMove(object);
 }
 
-void HistoryItem::addChildItem(PassRefPtr<HistoryItem> child)
+void HistoryItem::addChildItem(Ref<HistoryItem>&& child)
 {
     ASSERT(!childItemWithTarget(child->target()));
-    m_children.append(child);
+    m_children.append(WTFMove(child));
 }
 
-void HistoryItem::setChildItem(PassRefPtr<HistoryItem> child)
+void HistoryItem::setChildItem(Ref<HistoryItem>&& child)
 {
     ASSERT(!child->isTargetItem());
     unsigned size = m_children.size();
     for (unsigned i = 0; i < size; ++i)  {
         if (m_children[i]->target() == child->target()) {
             child->setIsTargetItem(m_children[i]->isTargetItem());
-            m_children[i] = child;
+            m_children[i] = WTFMove(child);
             return;
         }
     }
-    m_children.append(child);
+    m_children.append(WTFMove(child));
 }
 
-HistoryItem* HistoryItem::childItemWithTarget(const String& target) const
+HistoryItem* HistoryItem::childItemWithTarget(const String& target)
 {
     unsigned size = m_children.size();
     for (unsigned i = 0; i < size; ++i) {
         if (m_children[i]->target() == target)
-            return m_children[i].get();
+            return m_children[i].ptr();
     }
-    return 0;
+    return nullptr;
 }
 
-HistoryItem* HistoryItem::childItemWithDocumentSequenceNumber(long long number) const
+HistoryItem* HistoryItem::childItemWithDocumentSequenceNumber(long long number)
 {
     unsigned size = m_children.size();
     for (unsigned i = 0; i < size; ++i) {
         if (m_children[i]->documentSequenceNumber() == number)
-            return m_children[i].get();
+            return m_children[i].ptr();
     }
-    return 0;
-}
-
-// <rdar://problem/4895849> HistoryItem::findTargetItem() should be replaced with a non-recursive method.
-HistoryItem* HistoryItem::findTargetItem()
-{
-    if (m_isTargetItem)
-        return this;
-    unsigned size = m_children.size();
-    for (unsigned i = 0; i < size; ++i) {
-        if (HistoryItem* match = m_children[i]->targetItem())
-            return match;
-    }
-    return 0;
-}
-
-HistoryItem* HistoryItem::targetItem()
-{
-    HistoryItem* foundItem = findTargetItem();
-    return foundItem ? foundItem : this;
+    return nullptr;
 }
 
 const HistoryItemVector& HistoryItem::children() const
@@ -443,13 +383,13 @@ void HistoryItem::clearChildren()
     m_children.clear();
 }
 
-bool HistoryItem::isAncestorOf(const HistoryItem* item) const
+bool HistoryItem::isAncestorOf(const HistoryItem& item) const
 {
     for (size_t i = 0; i < m_children.size(); ++i) {
-        HistoryItem* child = m_children[i].get();
-        if (child == item)
+        auto& child = m_children[i].get();
+        if (&child == &item)
             return true;
-        if (child->isAncestorOf(item))
+        if (child.isAncestorOf(item))
             return true;
     }
     return false;
@@ -458,34 +398,34 @@ bool HistoryItem::isAncestorOf(const HistoryItem* item) const
 // We do same-document navigation if going to a different item and if either of the following is true:
 // - The other item corresponds to the same document (for history entries created via pushState or fragment changes).
 // - The other item corresponds to the same set of documents, including frames (for history entries created via regular navigation)
-bool HistoryItem::shouldDoSameDocumentNavigationTo(HistoryItem* otherItem) const
+bool HistoryItem::shouldDoSameDocumentNavigationTo(HistoryItem& otherItem) const
 {
-    if (this == otherItem)
+    if (this == &otherItem)
         return false;
 
-    if (stateObject() || otherItem->stateObject())
-        return documentSequenceNumber() == otherItem->documentSequenceNumber();
+    if (stateObject() || otherItem.stateObject())
+        return documentSequenceNumber() == otherItem.documentSequenceNumber();
     
-    if ((url().hasFragmentIdentifier() || otherItem->url().hasFragmentIdentifier()) && equalIgnoringFragmentIdentifier(url(), otherItem->url()))
-        return documentSequenceNumber() == otherItem->documentSequenceNumber();        
+    if ((url().hasFragmentIdentifier() || otherItem.url().hasFragmentIdentifier()) && equalIgnoringFragmentIdentifier(url(), otherItem.url()))
+        return documentSequenceNumber() == otherItem.documentSequenceNumber();
     
     return hasSameDocumentTree(otherItem);
 }
 
 // Does a recursive check that this item and its descendants have the same
 // document sequence numbers as the other item.
-bool HistoryItem::hasSameDocumentTree(HistoryItem* otherItem) const
+bool HistoryItem::hasSameDocumentTree(HistoryItem& otherItem) const
 {
-    if (documentSequenceNumber() != otherItem->documentSequenceNumber())
+    if (documentSequenceNumber() != otherItem.documentSequenceNumber())
         return false;
         
-    if (children().size() != otherItem->children().size())
+    if (children().size() != otherItem.children().size())
         return false;
 
     for (size_t i = 0; i < children().size(); i++) {
-        HistoryItem* child = children()[i].get();
-        HistoryItem* otherChild = otherItem->childItemWithDocumentSequenceNumber(child->documentSequenceNumber());
-        if (!otherChild || !child->hasSameDocumentTree(otherChild))
+        auto& child = children()[i].get();
+        auto* otherChild = otherItem.childItemWithDocumentSequenceNumber(child.documentSequenceNumber());
+        if (!otherChild || !child.hasSameDocumentTree(*otherChild))
             return false;
     }
 
@@ -494,16 +434,16 @@ bool HistoryItem::hasSameDocumentTree(HistoryItem* otherItem) const
 
 // Does a non-recursive check that this item and its immediate children have the
 // same frames as the other item.
-bool HistoryItem::hasSameFrames(HistoryItem* otherItem) const
+bool HistoryItem::hasSameFrames(HistoryItem& otherItem) const
 {
-    if (target() != otherItem->target())
+    if (target() != otherItem.target())
         return false;
         
-    if (children().size() != otherItem->children().size())
+    if (children().size() != otherItem.children().size())
         return false;
 
     for (size_t i = 0; i < children().size(); i++) {
-        if (!otherItem->childItemWithTarget(children()[i]->target()))
+        if (!otherItem.childItemWithTarget(children()[i]->target()))
             return false;
     }
 
@@ -519,20 +459,20 @@ void HistoryItem::setFormInfoFromRequest(const ResourceRequest& request)
 {
     m_referrer = request.httpReferrer();
     
-    if (equalIgnoringCase(request.httpMethod(), "POST")) {
+    if (equalLettersIgnoringASCIICase(request.httpMethod(), "post")) {
         // FIXME: Eventually we have to make this smart enough to handle the case where
         // we have a stream for the body to handle the "data interspersed with files" feature.
         m_formData = request.httpBody();
         m_formContentType = request.httpContentType();
     } else {
-        m_formData = 0;
+        m_formData = nullptr;
         m_formContentType = String();
     }
 }
 
-void HistoryItem::setFormData(PassRefPtr<FormData> formData)
+void HistoryItem::setFormData(RefPtr<FormData>&& formData)
 {
-    m_formData = formData;
+    m_formData = WTFMove(formData);
 }
 
 void HistoryItem::setFormContentType(const String& formContentType)
@@ -545,10 +485,10 @@ FormData* HistoryItem::formData()
     return m_formData.get();
 }
 
-bool HistoryItem::isCurrentDocument(Document* doc) const
+bool HistoryItem::isCurrentDocument(Document& document) const
 {
     // FIXME: We should find a better way to check if this is the current document.
-    return equalIgnoringFragmentIdentifier(url(), doc->url());
+    return equalIgnoringFragmentIdentifier(url(), document.url());
 }
 
 void HistoryItem::addRedirectURL(const String& url)
@@ -569,7 +509,12 @@ Vector<String>* HistoryItem::redirectURLs() const
 
 void HistoryItem::setRedirectURLs(std::unique_ptr<Vector<String>> redirectURLs)
 {
-    m_redirectURLs = WTF::move(redirectURLs);
+    m_redirectURLs = WTFMove(redirectURLs);
+}
+
+void HistoryItem::notifyChanged()
+{
+    notifyHistoryItemChanged(this);
 }
 
 #ifndef NDEBUG