1 /* 2 * Copyright (C) 2009 Google 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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "WebHistoryItem.h" 33 34 #include "WebSerializedScriptValue.h" 35 #include "bindings/v8/SerializedScriptValue.h" 36 #include "core/history/HistoryItem.h" 37 #include "core/html/forms/FormController.h" 38 #include "platform/network/FormData.h" 39 #include "platform/weborigin/KURL.h" 40 #include "public/platform/WebHTTPBody.h" 41 #include "public/platform/WebPoint.h" 42 #include "public/platform/WebString.h" 43 #include "public/platform/WebVector.h" 44 #include "wtf/text/StringHash.h" 45 46 using namespace WebCore; 47 48 namespace blink { 49 namespace { 50 51 void addReferencedFilePaths(HistoryItem* item, HashSet<String>& results) 52 { 53 const FormData* formData = item->formData(); 54 if (formData) { 55 for (size_t i = 0; i < formData->elements().size(); ++i) { 56 const FormDataElement& element = formData->elements()[i]; 57 if (element.m_type == FormDataElement::encodedFile) 58 results.add(element.m_filename); 59 } 60 } 61 62 const Vector<String>& filePaths = FormController::getReferencedFilePaths(item->documentState()); 63 for (size_t i = 0; i < filePaths.size(); ++i) 64 results.add(filePaths[i]); 65 66 const HistoryItemVector& children = item->children(); 67 for (size_t i = 0; i < children.size(); ++i) 68 addReferencedFilePaths(children[i].get(), results); 69 } 70 71 } // namespace 72 73 void WebHistoryItem::initialize() 74 { 75 m_private = HistoryItem::create(); 76 } 77 78 void WebHistoryItem::reset() 79 { 80 m_private.reset(); 81 } 82 83 void WebHistoryItem::assign(const WebHistoryItem& other) 84 { 85 m_private = other.m_private; 86 } 87 88 WebString WebHistoryItem::urlString() const 89 { 90 return m_private->urlString(); 91 } 92 93 void WebHistoryItem::setURLString(const WebString& url) 94 { 95 ensureMutable(); 96 m_private->setURLString(KURL(ParsedURLString, url).string()); 97 } 98 99 WebString WebHistoryItem::originalURLString() const 100 { 101 return m_private->originalURLString(); 102 } 103 104 void WebHistoryItem::setOriginalURLString(const WebString& originalURLString) 105 { 106 ensureMutable(); 107 m_private->setOriginalURLString(originalURLString); 108 } 109 110 WebString WebHistoryItem::referrer() const 111 { 112 return m_private->referrer(); 113 } 114 115 void WebHistoryItem::setReferrer(const WebString& referrer) 116 { 117 ensureMutable(); 118 m_private->setReferrer(referrer); 119 } 120 121 WebString WebHistoryItem::target() const 122 { 123 return m_private->target(); 124 } 125 126 void WebHistoryItem::setTarget(const WebString& target) 127 { 128 ensureMutable(); 129 m_private->setTarget(target); 130 } 131 132 WebPoint WebHistoryItem::scrollOffset() const 133 { 134 return m_private->scrollPoint(); 135 } 136 137 void WebHistoryItem::setScrollOffset(const WebPoint& scrollOffset) 138 { 139 ensureMutable(); 140 m_private->setScrollPoint(scrollOffset); 141 } 142 143 float WebHistoryItem::pageScaleFactor() const 144 { 145 return m_private->pageScaleFactor(); 146 } 147 148 void WebHistoryItem::setPageScaleFactor(float scale) 149 { 150 ensureMutable(); 151 m_private->setPageScaleFactor(scale); 152 } 153 154 WebVector<WebString> WebHistoryItem::documentState() const 155 { 156 return m_private->documentState(); 157 } 158 159 void WebHistoryItem::setDocumentState(const WebVector<WebString>& state) 160 { 161 ensureMutable(); 162 // FIXME: would be nice to avoid the intermediate copy 163 Vector<String> ds; 164 for (size_t i = 0; i < state.size(); ++i) 165 ds.append(state[i]); 166 m_private->setDocumentState(ds); 167 } 168 169 long long WebHistoryItem::itemSequenceNumber() const 170 { 171 return m_private->itemSequenceNumber(); 172 } 173 174 void WebHistoryItem::setItemSequenceNumber(long long itemSequenceNumber) 175 { 176 ensureMutable(); 177 m_private->setItemSequenceNumber(itemSequenceNumber); 178 } 179 180 long long WebHistoryItem::documentSequenceNumber() const 181 { 182 return m_private->documentSequenceNumber(); 183 } 184 185 void WebHistoryItem::setDocumentSequenceNumber(long long documentSequenceNumber) 186 { 187 ensureMutable(); 188 m_private->setDocumentSequenceNumber(documentSequenceNumber); 189 } 190 191 long long WebHistoryItem::targetFrameID() const 192 { 193 return m_private->targetFrameID(); 194 } 195 196 void WebHistoryItem::setTargetFrameID(long long targetFrameID) 197 { 198 ensureMutable(); 199 m_private->setTargetFrameID(targetFrameID); 200 } 201 202 WebSerializedScriptValue WebHistoryItem::stateObject() const 203 { 204 return WebSerializedScriptValue(m_private->stateObject()); 205 } 206 207 void WebHistoryItem::setStateObject(const WebSerializedScriptValue& object) 208 { 209 ensureMutable(); 210 m_private->setStateObject(object); 211 } 212 213 WebString WebHistoryItem::httpContentType() const 214 { 215 return m_private->formContentType(); 216 } 217 218 void WebHistoryItem::setHTTPContentType(const WebString& httpContentType) 219 { 220 ensureMutable(); 221 m_private->setFormContentType(httpContentType); 222 } 223 224 WebHTTPBody WebHistoryItem::httpBody() const 225 { 226 return WebHTTPBody(m_private->formData()); 227 } 228 229 void WebHistoryItem::setHTTPBody(const WebHTTPBody& httpBody) 230 { 231 ensureMutable(); 232 m_private->setFormData(httpBody); 233 } 234 235 WebVector<WebHistoryItem> WebHistoryItem::children() const 236 { 237 return m_private->children(); 238 } 239 240 void WebHistoryItem::setChildren(const WebVector<WebHistoryItem>& items) 241 { 242 ensureMutable(); 243 m_private->clearChildren(); 244 for (size_t i = 0; i < items.size(); ++i) 245 m_private->addChildItem(items[i]); 246 } 247 248 void WebHistoryItem::appendToChildren(const WebHistoryItem& item) 249 { 250 ensureMutable(); 251 m_private->addChildItem(item); 252 } 253 254 WebVector<WebString> WebHistoryItem::getReferencedFilePaths() const 255 { 256 HashSet<String> filePaths; 257 addReferencedFilePaths(m_private.get(), filePaths); 258 259 Vector<String> results; 260 copyToVector(filePaths, results); 261 return results; 262 } 263 264 WebHistoryItem::WebHistoryItem(const PassRefPtr<HistoryItem>& item) 265 : m_private(item) 266 { 267 } 268 269 WebHistoryItem& WebHistoryItem::operator=(const PassRefPtr<HistoryItem>& item) 270 { 271 m_private = item; 272 return *this; 273 } 274 275 WebHistoryItem::operator PassRefPtr<HistoryItem>() const 276 { 277 return m_private.get(); 278 } 279 280 void WebHistoryItem::ensureMutable() 281 { 282 if (!m_private->hasOneRef()) 283 m_private = m_private->copy(); 284 } 285 286 } // namespace blink 287