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 |