1 /* 2 * Copyright (C) 2005, 2006, 2008, 2011 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 #include "config.h" 27 #include "core/loader/HistoryItem.h" 28 29 #include "core/dom/Document.h" 30 #include "core/html/forms/FormController.h" 31 #include "platform/network/ResourceRequest.h" 32 #include "wtf/CurrentTime.h" 33 #include "wtf/text/CString.h" 34 35 namespace blink { 36 37 static long long generateSequenceNumber() 38 { 39 // Initialize to the current time to reduce the likelihood of generating 40 // identifiers that overlap with those from past/future browser sessions. 41 static long long next = static_cast<long long>(currentTime() * 1000000.0); 42 return ++next; 43 } 44 45 HistoryItem::HistoryItem() 46 : m_pageScaleFactor(0) 47 , m_itemSequenceNumber(generateSequenceNumber()) 48 , m_documentSequenceNumber(generateSequenceNumber()) 49 , m_frameSequenceNumber(generateSequenceNumber()) 50 { 51 } 52 53 HistoryItem::~HistoryItem() 54 { 55 } 56 57 void HistoryItem::generateNewItemSequenceNumber() 58 { 59 m_itemSequenceNumber = generateSequenceNumber(); 60 } 61 62 void HistoryItem::generateNewDocumentSequenceNumber() 63 { 64 m_documentSequenceNumber = generateSequenceNumber(); 65 } 66 67 const String& HistoryItem::urlString() const 68 { 69 return m_urlString; 70 } 71 72 KURL HistoryItem::url() const 73 { 74 return KURL(ParsedURLString, m_urlString); 75 } 76 77 const Referrer& HistoryItem::referrer() const 78 { 79 return m_referrer; 80 } 81 82 const String& HistoryItem::target() const 83 { 84 return m_target; 85 } 86 87 void HistoryItem::setURLString(const String& urlString) 88 { 89 if (m_urlString != urlString) 90 m_urlString = urlString; 91 } 92 93 void HistoryItem::setURL(const KURL& url) 94 { 95 setURLString(url.string()); 96 } 97 98 void HistoryItem::setReferrer(const Referrer& referrer) 99 { 100 m_referrer = referrer; 101 } 102 103 void HistoryItem::setTarget(const String& target) 104 { 105 m_target = target; 106 } 107 108 const FloatPoint& HistoryItem::pinchViewportScrollPoint() const 109 { 110 return m_pinchViewportScrollPoint; 111 } 112 113 void HistoryItem::setPinchViewportScrollPoint(const FloatPoint& point) 114 { 115 m_pinchViewportScrollPoint = point; 116 } 117 118 const IntPoint& HistoryItem::scrollPoint() const 119 { 120 return m_scrollPoint; 121 } 122 123 void HistoryItem::setScrollPoint(const IntPoint& point) 124 { 125 m_scrollPoint = point; 126 } 127 128 void HistoryItem::clearScrollPoint() 129 { 130 m_scrollPoint = IntPoint(); 131 m_pinchViewportScrollPoint = FloatPoint(); 132 } 133 134 float HistoryItem::pageScaleFactor() const 135 { 136 return m_pageScaleFactor; 137 } 138 139 void HistoryItem::setPageScaleFactor(float scaleFactor) 140 { 141 m_pageScaleFactor = scaleFactor; 142 } 143 144 void HistoryItem::setDocumentState(const Vector<String>& state) 145 { 146 ASSERT(!m_documentState); 147 m_documentStateVector = state; 148 } 149 150 void HistoryItem::setDocumentState(DocumentState* state) 151 { 152 m_documentState = state; 153 } 154 155 const Vector<String>& HistoryItem::documentState() 156 { 157 if (m_documentState) 158 m_documentStateVector = m_documentState->toStateVector(); 159 return m_documentStateVector; 160 } 161 162 Vector<String> HistoryItem::getReferencedFilePaths() 163 { 164 return FormController::getReferencedFilePaths(documentState()); 165 } 166 167 void HistoryItem::clearDocumentState() 168 { 169 m_documentState.clear(); 170 m_documentStateVector.clear(); 171 } 172 173 void HistoryItem::setStateObject(PassRefPtr<SerializedScriptValue> object) 174 { 175 m_stateObject = object; 176 } 177 178 const AtomicString& HistoryItem::formContentType() const 179 { 180 return m_formContentType; 181 } 182 183 void HistoryItem::setFormInfoFromRequest(const ResourceRequest& request) 184 { 185 if (equalIgnoringCase(request.httpMethod(), "POST")) { 186 // FIXME: Eventually we have to make this smart enough to handle the case where 187 // we have a stream for the body to handle the "data interspersed with files" feature. 188 m_formData = request.httpBody(); 189 m_formContentType = request.httpContentType(); 190 } else { 191 m_formData = nullptr; 192 m_formContentType = nullAtom; 193 } 194 } 195 196 void HistoryItem::setFormData(PassRefPtr<FormData> formData) 197 { 198 m_formData = formData; 199 } 200 201 void HistoryItem::setFormContentType(const AtomicString& formContentType) 202 { 203 m_formContentType = formContentType; 204 } 205 206 FormData* HistoryItem::formData() 207 { 208 return m_formData.get(); 209 } 210 211 bool HistoryItem::isCurrentDocument(Document* doc) const 212 { 213 // FIXME: We should find a better way to check if this is the current document. 214 return equalIgnoringFragmentIdentifier(url(), doc->url()); 215 } 216 217 } // namespace blink 218 219