| 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 "content/common/page_state_serialization.h" | 7 #include "content/common/page_state_serialization.h" |
| 8 #include "content/public/common/page_state.h" | 8 #include "content/public/common/page_state.h" |
| 9 #include "content/renderer/history_entry.h" |
| 9 #include "third_party/WebKit/public/platform/WebHTTPBody.h" | 10 #include "third_party/WebKit/public/platform/WebHTTPBody.h" |
| 10 #include "third_party/WebKit/public/platform/WebPoint.h" | 11 #include "third_party/WebKit/public/platform/WebPoint.h" |
| 11 #include "third_party/WebKit/public/platform/WebString.h" | 12 #include "third_party/WebKit/public/platform/WebString.h" |
| 12 #include "third_party/WebKit/public/platform/WebVector.h" | 13 #include "third_party/WebKit/public/platform/WebVector.h" |
| 13 #include "third_party/WebKit/public/web/WebHistoryItem.h" | 14 #include "third_party/WebKit/public/web/WebHistoryItem.h" |
| 14 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h" | 15 #include "third_party/WebKit/public/web/WebSerializedScriptValue.h" |
| 15 | 16 |
| 16 using blink::WebHTTPBody; | 17 using blink::WebHTTPBody; |
| 17 using blink::WebHistoryItem; | 18 using blink::WebHistoryItem; |
| 18 using blink::WebSerializedScriptValue; | 19 using blink::WebSerializedScriptValue; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 element.file_start, | 73 element.file_start, |
| 73 element.file_length, | 74 element.file_length, |
| 74 element.file_modification_time); | 75 element.file_modification_time); |
| 75 break; | 76 break; |
| 76 case WebHTTPBody::Element::TypeBlob: | 77 case WebHTTPBody::Element::TypeBlob: |
| 77 http_body->appendBlob(WebString::fromUTF8(element.blob_uuid)); | 78 http_body->appendBlob(WebString::fromUTF8(element.blob_uuid)); |
| 78 break; | 79 break; |
| 79 } | 80 } |
| 80 } | 81 } |
| 81 | 82 |
| 82 bool RecursivelyGenerateFrameState(const WebHistoryItem& item, | 83 void GenerateFrameStateFromItem(const WebHistoryItem& item, |
| 83 ExplodedFrameState* state) { | 84 ExplodedFrameState* state) { |
| 84 state->url_string = item.urlString(); | 85 state->url_string = item.urlString(); |
| 85 state->referrer = item.referrer(); | 86 state->referrer = item.referrer(); |
| 86 state->referrer_policy = item.referrerPolicy(); | 87 state->referrer_policy = item.referrerPolicy(); |
| 87 state->target = item.target(); | 88 state->target = item.target(); |
| 88 if (!item.stateObject().isNull()) | 89 if (!item.stateObject().isNull()) |
| 89 state->state_object = item.stateObject().toString(); | 90 state->state_object = item.stateObject().toString(); |
| 90 state->scroll_offset = item.scrollOffset(); | 91 state->scroll_offset = item.scrollOffset(); |
| 91 state->item_sequence_number = item.itemSequenceNumber(); | 92 state->item_sequence_number = item.itemSequenceNumber(); |
| 92 state->document_sequence_number = | 93 state->document_sequence_number = |
| 93 item.documentSequenceNumber(); | 94 item.documentSequenceNumber(); |
| 94 state->page_scale_factor = item.pageScaleFactor(); | 95 state->page_scale_factor = item.pageScaleFactor(); |
| 95 ToNullableString16Vector(item.documentState(), &state->document_state); | 96 ToNullableString16Vector(item.documentState(), &state->document_state); |
| 96 | 97 |
| 97 state->http_body.http_content_type = item.httpContentType(); | 98 state->http_body.http_content_type = item.httpContentType(); |
| 98 const WebHTTPBody& http_body = item.httpBody(); | 99 const WebHTTPBody& http_body = item.httpBody(); |
| 99 if (!(state->http_body.is_null = http_body.isNull())) { | 100 if (!(state->http_body.is_null = http_body.isNull())) { |
| 100 state->http_body.identifier = http_body.identifier(); | 101 state->http_body.identifier = http_body.identifier(); |
| 101 state->http_body.elements.resize(http_body.elementCount()); | 102 state->http_body.elements.resize(http_body.elementCount()); |
| 102 for (size_t i = 0; i < http_body.elementCount(); ++i) { | 103 for (size_t i = 0; i < http_body.elementCount(); ++i) { |
| 103 WebHTTPBody::Element element; | 104 WebHTTPBody::Element element; |
| 104 http_body.elementAt(i, element); | 105 http_body.elementAt(i, element); |
| 105 ToExplodedHttpBodyElement(element, &state->http_body.elements[i]); | 106 ToExplodedHttpBodyElement(element, &state->http_body.elements[i]); |
| 106 } | 107 } |
| 107 state->http_body.contains_passwords = http_body.containsPasswordData(); | 108 state->http_body.contains_passwords = http_body.containsPasswordData(); |
| 108 } | 109 } |
| 109 | |
| 110 const WebVector<WebHistoryItem>& children = item.children(); | |
| 111 state->children.resize(children.size()); | |
| 112 for (size_t i = 0; i < children.size(); ++i) { | |
| 113 if (!RecursivelyGenerateFrameState(children[i], &state->children[i])) | |
| 114 return false; | |
| 115 } | |
| 116 | |
| 117 return true; | |
| 118 } | 110 } |
| 119 | 111 |
| 120 bool RecursivelyGenerateHistoryItem(const ExplodedFrameState& state, | 112 void RecursivelyGenerateFrameState(HistoryEntry::HistoryNode* node, |
| 121 WebHistoryItem* item) { | 113 ExplodedFrameState* state) { |
| 122 item->setURLString(state.url_string); | 114 GenerateFrameStateFromItem(node->item(), state); |
| 123 item->setReferrer(state.referrer, state.referrer_policy); | 115 |
| 124 item->setTarget(state.target); | 116 std::vector<HistoryEntry::HistoryNode*>& children = node->children(); |
| 117 state->children.resize(children.size()); |
| 118 for (size_t i = 0; i < children.size(); ++i) |
| 119 RecursivelyGenerateFrameState(children[i], &state->children[i]); |
| 120 } |
| 121 |
| 122 void RecursivelyGenerateHistoryItem(const ExplodedFrameState& state, |
| 123 HistoryEntry::HistoryNode* node) { |
| 124 WebHistoryItem item; |
| 125 item.initialize(); |
| 126 item.setURLString(state.url_string); |
| 127 item.setReferrer(state.referrer, state.referrer_policy); |
| 128 item.setTarget(state.target); |
| 125 if (!state.state_object.is_null()) { | 129 if (!state.state_object.is_null()) { |
| 126 item->setStateObject( | 130 item.setStateObject( |
| 127 WebSerializedScriptValue::fromString(state.state_object)); | 131 WebSerializedScriptValue::fromString(state.state_object)); |
| 128 } | 132 } |
| 129 item->setDocumentState(state.document_state); | 133 item.setDocumentState(state.document_state); |
| 130 item->setScrollOffset(state.scroll_offset); | 134 item.setScrollOffset(state.scroll_offset); |
| 131 item->setPageScaleFactor(state.page_scale_factor); | 135 item.setPageScaleFactor(state.page_scale_factor); |
| 132 | 136 |
| 133 // These values are generated at WebHistoryItem construction time, and we | 137 // These values are generated at WebHistoryItem construction time, and we |
| 134 // only want to override those new values with old values if the old values | 138 // only want to override those new values with old values if the old values |
| 135 // are defined. A value of 0 means undefined in this context. | 139 // are defined. A value of 0 means undefined in this context. |
| 136 if (state.item_sequence_number) | 140 if (state.item_sequence_number) |
| 137 item->setItemSequenceNumber(state.item_sequence_number); | 141 item.setItemSequenceNumber(state.item_sequence_number); |
| 138 if (state.document_sequence_number) | 142 if (state.document_sequence_number) |
| 139 item->setDocumentSequenceNumber(state.document_sequence_number); | 143 item.setDocumentSequenceNumber(state.document_sequence_number); |
| 140 | 144 |
| 141 item->setHTTPContentType(state.http_body.http_content_type); | 145 item.setHTTPContentType(state.http_body.http_content_type); |
| 142 if (!state.http_body.is_null) { | 146 if (!state.http_body.is_null) { |
| 143 WebHTTPBody http_body; | 147 WebHTTPBody http_body; |
| 144 http_body.initialize(); | 148 http_body.initialize(); |
| 145 http_body.setIdentifier(state.http_body.identifier); | 149 http_body.setIdentifier(state.http_body.identifier); |
| 146 for (size_t i = 0; i < state.http_body.elements.size(); ++i) | 150 for (size_t i = 0; i < state.http_body.elements.size(); ++i) |
| 147 AppendHTTPBodyElement(state.http_body.elements[i], &http_body); | 151 AppendHTTPBodyElement(state.http_body.elements[i], &http_body); |
| 148 item->setHTTPBody(http_body); | 152 item.setHTTPBody(http_body); |
| 149 } | 153 } |
| 154 node->set_item(item); |
| 150 | 155 |
| 151 for (size_t i = 0; i < state.children.size(); ++i) { | 156 for (size_t i = 0; i < state.children.size(); ++i) |
| 152 WebHistoryItem child_item; | 157 RecursivelyGenerateHistoryItem(state.children[i], node->AddChild()); |
| 153 child_item.initialize(); | |
| 154 if (!RecursivelyGenerateHistoryItem(state.children[i], &child_item)) | |
| 155 return false; | |
| 156 item->appendToChildren(child_item); | |
| 157 } | |
| 158 | |
| 159 return true; | |
| 160 } | 158 } |
| 161 | 159 |
| 162 } // namespace | 160 } // namespace |
| 163 | 161 |
| 164 PageState HistoryItemToPageState(const WebHistoryItem& item) { | 162 PageState HistoryEntryToPageState(HistoryEntry* entry) { |
| 165 ExplodedPageState state; | 163 ExplodedPageState state; |
| 166 ToNullableString16Vector(item.getReferencedFilePaths(), | 164 ToNullableString16Vector(entry->root().getReferencedFilePaths(), |
| 167 &state.referenced_files); | 165 &state.referenced_files); |
| 168 | 166 |
| 169 if (!RecursivelyGenerateFrameState(item, &state.top)) | 167 RecursivelyGenerateFrameState(entry->root_history_node(), &state.top); |
| 170 return PageState(); | |
| 171 | 168 |
| 172 std::string encoded_data; | 169 std::string encoded_data; |
| 173 if (!EncodePageState(state, &encoded_data)) | 170 if (!EncodePageState(state, &encoded_data)) |
| 174 return PageState(); | 171 return PageState(); |
| 172 |
| 173 return PageState::CreateFromEncodedData(encoded_data); |
| 174 } |
| 175 |
| 176 PageState SingleHistoryItemToPageState(const WebHistoryItem& item) { |
| 177 ExplodedPageState state; |
| 178 ToNullableString16Vector(item.getReferencedFilePaths(), |
| 179 &state.referenced_files); |
| 180 GenerateFrameStateFromItem(item, &state.top); |
| 181 |
| 182 std::string encoded_data; |
| 183 if (!EncodePageState(state, &encoded_data)) |
| 184 return PageState(); |
| 175 | 185 |
| 176 return PageState::CreateFromEncodedData(encoded_data); | 186 return PageState::CreateFromEncodedData(encoded_data); |
| 177 } | 187 } |
| 178 | 188 |
| 179 WebHistoryItem PageStateToHistoryItem(const PageState& page_state) { | 189 HistoryEntry* PageStateToHistoryEntry(const PageState& page_state) { |
| 180 ExplodedPageState state; | 190 ExplodedPageState state; |
| 181 if (!DecodePageState(page_state.ToEncodedData(), &state)) | 191 if (!DecodePageState(page_state.ToEncodedData(), &state)) |
| 182 return WebHistoryItem(); | 192 return NULL; |
| 183 | 193 |
| 184 WebHistoryItem item; | 194 HistoryEntry* entry = new HistoryEntry(); |
| 185 item.initialize(); | 195 RecursivelyGenerateHistoryItem(state.top, entry->root_history_node()); |
| 186 if (!RecursivelyGenerateHistoryItem(state.top, &item)) | |
| 187 return WebHistoryItem(); | |
| 188 | 196 |
| 189 return item; | 197 return entry; |
| 190 } | 198 } |
| 191 | 199 |
| 192 } // namespace content | 200 } // namespace content |
| OLD | NEW |