| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/history_serialization.h" | 5 #include "content/renderer/history_serialization.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/strings/nullable_string16.h" |
| 9 #include "content/common/page_state_serialization.h" | 10 #include "content/common/page_state_serialization.h" |
| 10 #include "content/public/common/page_state.h" | 11 #include "content/public/common/page_state.h" |
| 11 #include "content/renderer/history_entry.h" | 12 #include "content/renderer/history_entry.h" |
| 13 #include "content/renderer/http_body_conversions.h" |
| 14 #include "third_party/WebKit/public/platform/WebData.h" |
| 12 #include "third_party/WebKit/public/platform/WebFloatPoint.h" | 15 #include "third_party/WebKit/public/platform/WebFloatPoint.h" |
| 13 #include "third_party/WebKit/public/platform/WebHTTPBody.h" | 16 #include "third_party/WebKit/public/platform/WebHTTPBody.h" |
| 14 #include "third_party/WebKit/public/platform/WebPoint.h" | 17 #include "third_party/WebKit/public/platform/WebPoint.h" |
| 15 #include "third_party/WebKit/public/platform/WebString.h" | 18 #include "third_party/WebKit/public/platform/WebString.h" |
| 16 #include "third_party/WebKit/public/platform/WebVector.h" | 19 #include "third_party/WebKit/public/platform/WebVector.h" |
| 17 #include "third_party/WebKit/public/web/WebHistoryItem.h" | 20 #include "third_party/WebKit/public/web/WebHistoryItem.h" |
| 18 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h" | 21 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h" |
| 19 | 22 |
| 23 using blink::WebData; |
| 20 using blink::WebHTTPBody; | 24 using blink::WebHTTPBody; |
| 21 using blink::WebHistoryItem; | 25 using blink::WebHistoryItem; |
| 22 using blink::WebSerializedScriptValue; | 26 using blink::WebSerializedScriptValue; |
| 23 using blink::WebString; | 27 using blink::WebString; |
| 24 using blink::WebVector; | 28 using blink::WebVector; |
| 25 | 29 |
| 26 namespace content { | 30 namespace content { |
| 27 namespace { | 31 namespace { |
| 28 | 32 |
| 29 void ToNullableString16Vector(const WebVector<WebString>& input, | 33 void ToNullableString16Vector(const WebVector<WebString>& input, |
| 30 std::vector<base::NullableString16>* output) { | 34 std::vector<base::NullableString16>* output) { |
| 31 output->reserve(output->size() + input.size()); | 35 output->reserve(output->size() + input.size()); |
| 32 for (size_t i = 0; i < input.size(); ++i) | 36 for (size_t i = 0; i < input.size(); ++i) |
| 33 output->push_back(input[i]); | 37 output->push_back(input[i]); |
| 34 } | 38 } |
| 35 | 39 |
| 36 void ToExplodedHttpBodyElement(const WebHTTPBody::Element& input, | |
| 37 ExplodedHttpBodyElement* output) { | |
| 38 switch (input.type) { | |
| 39 case WebHTTPBody::Element::TypeData: | |
| 40 output->data.assign(input.data.data(), input.data.size()); | |
| 41 break; | |
| 42 case WebHTTPBody::Element::TypeFile: | |
| 43 output->file_path = input.filePath; | |
| 44 output->file_start = input.fileStart; | |
| 45 output->file_length = input.fileLength; | |
| 46 output->file_modification_time = input.modificationTime; | |
| 47 break; | |
| 48 case WebHTTPBody::Element::TypeFileSystemURL: | |
| 49 output->filesystem_url = input.fileSystemURL; | |
| 50 output->file_start = input.fileStart; | |
| 51 output->file_length = input.fileLength; | |
| 52 output->file_modification_time = input.modificationTime; | |
| 53 break; | |
| 54 case WebHTTPBody::Element::TypeBlob: | |
| 55 output->blob_uuid = input.blobUUID.utf8(); | |
| 56 break; | |
| 57 } | |
| 58 } | |
| 59 | |
| 60 void AppendHTTPBodyElement(const ExplodedHttpBodyElement& element, | |
| 61 WebHTTPBody* http_body) { | |
| 62 switch (element.type) { | |
| 63 case WebHTTPBody::Element::TypeData: | |
| 64 http_body->appendData(element.data); | |
| 65 break; | |
| 66 case WebHTTPBody::Element::TypeFile: | |
| 67 http_body->appendFileRange( | |
| 68 element.file_path, | |
| 69 element.file_start, | |
| 70 element.file_length, | |
| 71 element.file_modification_time); | |
| 72 break; | |
| 73 case WebHTTPBody::Element::TypeFileSystemURL: | |
| 74 http_body->appendFileSystemURLRange( | |
| 75 element.filesystem_url, | |
| 76 element.file_start, | |
| 77 element.file_length, | |
| 78 element.file_modification_time); | |
| 79 break; | |
| 80 case WebHTTPBody::Element::TypeBlob: | |
| 81 http_body->appendBlob(WebString::fromUTF8(element.blob_uuid)); | |
| 82 break; | |
| 83 } | |
| 84 } | |
| 85 | |
| 86 void GenerateFrameStateFromItem(const WebHistoryItem& item, | 40 void GenerateFrameStateFromItem(const WebHistoryItem& item, |
| 87 ExplodedFrameState* state) { | 41 ExplodedFrameState* state) { |
| 88 state->url_string = item.urlString(); | 42 state->url_string = item.urlString(); |
| 89 state->referrer = item.referrer(); | 43 state->referrer = item.referrer(); |
| 90 state->referrer_policy = item.referrerPolicy(); | 44 state->referrer_policy = item.referrerPolicy(); |
| 91 state->target = item.target(); | 45 state->target = item.target(); |
| 92 if (!item.stateObject().isNull()) | 46 if (!item.stateObject().isNull()) |
| 93 state->state_object = item.stateObject().toString(); | 47 state->state_object = item.stateObject().toString(); |
| 94 state->scroll_restoration_type = item.scrollRestorationType(); | 48 state->scroll_restoration_type = item.scrollRestorationType(); |
| 95 state->visual_viewport_scroll_offset = item.visualViewportScrollOffset(); | 49 state->visual_viewport_scroll_offset = item.visualViewportScrollOffset(); |
| 96 state->scroll_offset = item.scrollOffset(); | 50 state->scroll_offset = item.scrollOffset(); |
| 97 state->item_sequence_number = item.itemSequenceNumber(); | 51 state->item_sequence_number = item.itemSequenceNumber(); |
| 98 state->document_sequence_number = | 52 state->document_sequence_number = |
| 99 item.documentSequenceNumber(); | 53 item.documentSequenceNumber(); |
| 100 state->page_scale_factor = item.pageScaleFactor(); | 54 state->page_scale_factor = item.pageScaleFactor(); |
| 101 ToNullableString16Vector(item.documentState(), &state->document_state); | 55 ToNullableString16Vector(item.documentState(), &state->document_state); |
| 102 | 56 |
| 103 state->http_body.http_content_type = item.httpContentType(); | 57 state->http_body.http_content_type = item.httpContentType(); |
| 104 const WebHTTPBody& http_body = item.httpBody(); | 58 const WebHTTPBody& http_body = item.httpBody(); |
| 105 state->http_body.is_null = http_body.isNull(); | 59 state->http_body.is_null = http_body.isNull(); |
| 106 if (!state->http_body.is_null) { | 60 if (!state->http_body.is_null) { |
| 107 state->http_body.identifier = http_body.identifier(); | 61 state->http_body.identifier = http_body.identifier(); |
| 108 state->http_body.elements.resize(http_body.elementCount()); | 62 state->http_body.elements.resize(http_body.elementCount()); |
| 109 for (size_t i = 0; i < http_body.elementCount(); ++i) { | 63 for (size_t i = 0; i < http_body.elementCount(); ++i) { |
| 110 WebHTTPBody::Element element; | 64 WebHTTPBody::Element element; |
| 111 http_body.elementAt(i, element); | 65 http_body.elementAt(i, element); |
| 112 ToExplodedHttpBodyElement(element, &state->http_body.elements[i]); | 66 ConvertToHttpBodyElement(element, &state->http_body.elements[i]); |
| 113 } | 67 } |
| 114 state->http_body.contains_passwords = http_body.containsPasswordData(); | 68 state->http_body.contains_passwords = http_body.containsPasswordData(); |
| 115 } | 69 } |
| 116 } | 70 } |
| 117 | 71 |
| 118 void RecursivelyGenerateFrameState( | 72 void RecursivelyGenerateFrameState( |
| 119 HistoryEntry::HistoryNode* node, | 73 HistoryEntry::HistoryNode* node, |
| 120 ExplodedFrameState* state, | 74 ExplodedFrameState* state, |
| 121 std::vector<base::NullableString16>* referenced_files) { | 75 std::vector<base::NullableString16>* referenced_files) { |
| 122 GenerateFrameStateFromItem(node->item(), state); | 76 GenerateFrameStateFromItem(node->item(), state); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 item.setItemSequenceNumber(state.item_sequence_number); | 109 item.setItemSequenceNumber(state.item_sequence_number); |
| 156 if (state.document_sequence_number) | 110 if (state.document_sequence_number) |
| 157 item.setDocumentSequenceNumber(state.document_sequence_number); | 111 item.setDocumentSequenceNumber(state.document_sequence_number); |
| 158 | 112 |
| 159 item.setHTTPContentType(state.http_body.http_content_type); | 113 item.setHTTPContentType(state.http_body.http_content_type); |
| 160 if (!state.http_body.is_null) { | 114 if (!state.http_body.is_null) { |
| 161 WebHTTPBody http_body; | 115 WebHTTPBody http_body; |
| 162 http_body.initialize(); | 116 http_body.initialize(); |
| 163 http_body.setIdentifier(state.http_body.identifier); | 117 http_body.setIdentifier(state.http_body.identifier); |
| 164 for (size_t i = 0; i < state.http_body.elements.size(); ++i) | 118 for (size_t i = 0; i < state.http_body.elements.size(); ++i) |
| 165 AppendHTTPBodyElement(state.http_body.elements[i], &http_body); | 119 AppendHttpBodyElement(state.http_body.elements[i], &http_body); |
| 166 item.setHTTPBody(http_body); | 120 item.setHTTPBody(http_body); |
| 167 } | 121 } |
| 168 node->set_item(item); | 122 node->set_item(item); |
| 169 | 123 |
| 170 for (size_t i = 0; i < state.children.size(); ++i) | 124 for (size_t i = 0; i < state.children.size(); ++i) |
| 171 RecursivelyGenerateHistoryItem(state.children[i], node->AddChild()); | 125 RecursivelyGenerateHistoryItem(state.children[i], node->AddChild()); |
| 172 } | 126 } |
| 173 | 127 |
| 174 } // namespace | 128 } // namespace |
| 175 | 129 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 204 if (!DecodePageState(page_state.ToEncodedData(), &state)) | 158 if (!DecodePageState(page_state.ToEncodedData(), &state)) |
| 205 return std::unique_ptr<HistoryEntry>(); | 159 return std::unique_ptr<HistoryEntry>(); |
| 206 | 160 |
| 207 std::unique_ptr<HistoryEntry> entry(new HistoryEntry()); | 161 std::unique_ptr<HistoryEntry> entry(new HistoryEntry()); |
| 208 RecursivelyGenerateHistoryItem(state.top, entry->root_history_node()); | 162 RecursivelyGenerateHistoryItem(state.top, entry->root_history_node()); |
| 209 | 163 |
| 210 return entry; | 164 return entry; |
| 211 } | 165 } |
| 212 | 166 |
| 213 } // namespace content | 167 } // namespace content |
| OLD | NEW |