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 "chrome/browser/android/tab_state.h" | 5 #include "chrome/browser/android/tab_state.h" |
6 | 6 |
7 #include <jni.h> | 7 #include <jni.h> |
8 #include <limits> | 8 #include <limits> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "jni/TabState_jni.h" | 26 #include "jni/TabState_jni.h" |
27 | 27 |
28 using base::android::ConvertUTF16ToJavaString; | 28 using base::android::ConvertUTF16ToJavaString; |
29 using base::android::ConvertUTF8ToJavaString; | 29 using base::android::ConvertUTF8ToJavaString; |
30 using base::android::ScopedJavaLocalRef; | 30 using base::android::ScopedJavaLocalRef; |
31 using content::NavigationController; | 31 using content::NavigationController; |
32 using content::WebContents; | 32 using content::WebContents; |
33 | 33 |
34 namespace { | 34 namespace { |
35 | 35 |
36 bool WriteStateHeaderToPickle(bool off_the_record, int entry_count, | 36 bool WriteStateHeaderToPickle(bool off_the_record, |
37 int current_entry_index, Pickle* pickle) { | 37 int entry_count, |
| 38 int current_entry_index, |
| 39 base::Pickle* pickle) { |
38 return pickle->WriteBool(off_the_record) && | 40 return pickle->WriteBool(off_the_record) && |
39 pickle->WriteInt(entry_count) && | 41 pickle->WriteInt(entry_count) && |
40 pickle->WriteInt(current_entry_index); | 42 pickle->WriteInt(current_entry_index); |
41 } | 43 } |
42 | 44 |
43 // Migrates a pickled SerializedNavigationEntry from Android tab version 0 to | 45 // Migrates a pickled SerializedNavigationEntry from Android tab version 0 to |
44 // 2 or (Chrome 18->26). | 46 // 2 or (Chrome 18->26). |
45 // | 47 // |
46 // Due to the fact that all SerializedNavigationEntrys were previously stored | 48 // Due to the fact that all SerializedNavigationEntrys were previously stored |
47 // in a single pickle on Android, this function has to read the fields exactly | 49 // in a single pickle on Android, this function has to read the fields exactly |
(...skipping 11 matching lines...) Expand all Loading... |
59 // transition_type | 61 // transition_type |
60 // type_mask | 62 // type_mask |
61 // | 63 // |
62 // 2. For each tab navigation: | 64 // 2. For each tab navigation: |
63 // referrer | 65 // referrer |
64 // is_overriding_user_agent | 66 // is_overriding_user_agent |
65 // | 67 // |
66 void UpgradeNavigationFromV0ToV2( | 68 void UpgradeNavigationFromV0ToV2( |
67 std::vector<sessions::SerializedNavigationEntry>* navigations, | 69 std::vector<sessions::SerializedNavigationEntry>* navigations, |
68 int entry_count, | 70 int entry_count, |
69 PickleIterator* iterator) { | 71 base::PickleIterator* iterator) { |
70 | |
71 for (int i = 0; i < entry_count; ++i) { | 72 for (int i = 0; i < entry_count; ++i) { |
72 Pickle v2_pickle; | 73 base::Pickle v2_pickle; |
73 std::string virtual_url_spec; | 74 std::string virtual_url_spec; |
74 std::string str_referrer; | 75 std::string str_referrer; |
75 base::string16 title; | 76 base::string16 title; |
76 std::string content_state; | 77 std::string content_state; |
77 int transition_type_int; | 78 int transition_type_int; |
78 if (!iterator->ReadString(&virtual_url_spec) || | 79 if (!iterator->ReadString(&virtual_url_spec) || |
79 !iterator->ReadString(&str_referrer) || | 80 !iterator->ReadString(&str_referrer) || |
80 !iterator->ReadString16(&title) || | 81 !iterator->ReadString16(&title) || |
81 !iterator->ReadString(&content_state) || | 82 !iterator->ReadString(&content_state) || |
82 !iterator->ReadInt(&transition_type_int)) | 83 !iterator->ReadInt(&transition_type_int)) |
(...skipping 14 matching lines...) Expand all Loading... |
97 v2_pickle.WriteInt(0); | 98 v2_pickle.WriteInt(0); |
98 // original_request_url_spec | 99 // original_request_url_spec |
99 v2_pickle.WriteString(std::string()); | 100 v2_pickle.WriteString(std::string()); |
100 // is_overriding_user_agent | 101 // is_overriding_user_agent |
101 v2_pickle.WriteBool(false); | 102 v2_pickle.WriteBool(false); |
102 // timestamp_internal_value | 103 // timestamp_internal_value |
103 v2_pickle.WriteInt64(0); | 104 v2_pickle.WriteInt64(0); |
104 // search_terms | 105 // search_terms |
105 v2_pickle.WriteString16(base::string16()); | 106 v2_pickle.WriteString16(base::string16()); |
106 | 107 |
107 PickleIterator tab_navigation_pickle_iterator(v2_pickle); | 108 base::PickleIterator tab_navigation_pickle_iterator(v2_pickle); |
108 sessions::SerializedNavigationEntry nav; | 109 sessions::SerializedNavigationEntry nav; |
109 if (nav.ReadFromPickle(&tab_navigation_pickle_iterator)) { | 110 if (nav.ReadFromPickle(&tab_navigation_pickle_iterator)) { |
110 navigations->push_back(nav); | 111 navigations->push_back(nav); |
111 } else { | 112 } else { |
112 LOG(ERROR) << "Failed to read SerializedNavigationEntry from pickle " | 113 LOG(ERROR) << "Failed to read SerializedNavigationEntry from pickle " |
113 << "(index=" << i << ", url=" << virtual_url_spec; | 114 << "(index=" << i << ", url=" << virtual_url_spec; |
114 } | 115 } |
115 | 116 |
116 } | 117 } |
117 | 118 |
(...skipping 27 matching lines...) Expand all Loading... |
145 // type_mask | 146 // type_mask |
146 // referrer | 147 // referrer |
147 // original_request_url | 148 // original_request_url |
148 // is_overriding_user_agent | 149 // is_overriding_user_agent |
149 // timestamp | 150 // timestamp |
150 // | 151 // |
151 // And finally search_terms was added and this function appends it. | 152 // And finally search_terms was added and this function appends it. |
152 void UpgradeNavigationFromV1ToV2( | 153 void UpgradeNavigationFromV1ToV2( |
153 std::vector<sessions::SerializedNavigationEntry>* navigations, | 154 std::vector<sessions::SerializedNavigationEntry>* navigations, |
154 int entry_count, | 155 int entry_count, |
155 PickleIterator* iterator) { | 156 base::PickleIterator* iterator) { |
156 for (int i = 0; i < entry_count; ++i) { | 157 for (int i = 0; i < entry_count; ++i) { |
157 Pickle v2_pickle; | 158 base::Pickle v2_pickle; |
158 | 159 |
159 int index; | 160 int index; |
160 std::string virtual_url_spec; | 161 std::string virtual_url_spec; |
161 base::string16 title; | 162 base::string16 title; |
162 std::string content_state; | 163 std::string content_state; |
163 int transition_type_int; | 164 int transition_type_int; |
164 if (!iterator->ReadInt(&index) || | 165 if (!iterator->ReadInt(&index) || |
165 !iterator->ReadString(&virtual_url_spec) || | 166 !iterator->ReadString(&virtual_url_spec) || |
166 !iterator->ReadString16(&title) || | 167 !iterator->ReadString16(&title) || |
167 !iterator->ReadString(&content_state) || | 168 !iterator->ReadString(&content_state) || |
(...skipping 28 matching lines...) Expand all Loading... |
196 if (iterator->ReadBool(&is_overriding_user_agent)) | 197 if (iterator->ReadBool(&is_overriding_user_agent)) |
197 v2_pickle.WriteBool(is_overriding_user_agent); | 198 v2_pickle.WriteBool(is_overriding_user_agent); |
198 | 199 |
199 int64 timestamp_internal_value = 0; | 200 int64 timestamp_internal_value = 0; |
200 if (iterator->ReadInt64(×tamp_internal_value)) | 201 if (iterator->ReadInt64(×tamp_internal_value)) |
201 v2_pickle.WriteInt64(timestamp_internal_value); | 202 v2_pickle.WriteInt64(timestamp_internal_value); |
202 | 203 |
203 // Force output of search_terms | 204 // Force output of search_terms |
204 v2_pickle.WriteString16(base::string16()); | 205 v2_pickle.WriteString16(base::string16()); |
205 | 206 |
206 PickleIterator tab_navigation_pickle_iterator(v2_pickle); | 207 base::PickleIterator tab_navigation_pickle_iterator(v2_pickle); |
207 sessions::SerializedNavigationEntry nav; | 208 sessions::SerializedNavigationEntry nav; |
208 if (nav.ReadFromPickle(&tab_navigation_pickle_iterator)) { | 209 if (nav.ReadFromPickle(&tab_navigation_pickle_iterator)) { |
209 navigations->push_back(nav); | 210 navigations->push_back(nav); |
210 } else { | 211 } else { |
211 LOG(ERROR) << "Failed to read SerializedNavigationEntry from pickle " | 212 LOG(ERROR) << "Failed to read SerializedNavigationEntry from pickle " |
212 << "(index=" << i << ", url=" << virtual_url_spec; | 213 << "(index=" << i << ", url=" << virtual_url_spec; |
213 } | 214 } |
214 } | 215 } |
215 } | 216 } |
216 | 217 |
217 // Extracts state and navigation entries from the given Pickle data and returns | 218 // Extracts state and navigation entries from the given Pickle data and returns |
218 // whether un-pickling the data succeeded | 219 // whether un-pickling the data succeeded |
219 bool ExtractNavigationEntries( | 220 bool ExtractNavigationEntries( |
220 void* data, | 221 void* data, |
221 int size, | 222 int size, |
222 int saved_state_version, | 223 int saved_state_version, |
223 bool* is_off_the_record, | 224 bool* is_off_the_record, |
224 int* current_entry_index, | 225 int* current_entry_index, |
225 std::vector<sessions::SerializedNavigationEntry>* navigations) { | 226 std::vector<sessions::SerializedNavigationEntry>* navigations) { |
226 int entry_count; | 227 int entry_count; |
227 Pickle pickle(static_cast<char*>(data), size); | 228 base::Pickle pickle(static_cast<char*>(data), size); |
228 PickleIterator iter(pickle); | 229 base::PickleIterator iter(pickle); |
229 if (!iter.ReadBool(is_off_the_record) || !iter.ReadInt(&entry_count) || | 230 if (!iter.ReadBool(is_off_the_record) || !iter.ReadInt(&entry_count) || |
230 !iter.ReadInt(current_entry_index)) { | 231 !iter.ReadInt(current_entry_index)) { |
231 LOG(ERROR) << "Failed to restore state from byte array (length=" << size | 232 LOG(ERROR) << "Failed to restore state from byte array (length=" << size |
232 << ")."; | 233 << ")."; |
233 return false; | 234 return false; |
234 } | 235 } |
235 | 236 |
236 if (!saved_state_version) { | 237 if (!saved_state_version) { |
237 // When |saved_state_version| is 0, it predates our notion of each tab | 238 // When |saved_state_version| is 0, it predates our notion of each tab |
238 // having a saved version id. For that version of tab serialization, we | 239 // having a saved version id. For that version of tab serialization, we |
(...skipping 12 matching lines...) Expand all Loading... |
251 int tab_navigation_data_length = 0; | 252 int tab_navigation_data_length = 0; |
252 const char* tab_navigation_data = NULL; | 253 const char* tab_navigation_data = NULL; |
253 if (!iter.ReadInt(&tab_navigation_data_length) || | 254 if (!iter.ReadInt(&tab_navigation_data_length) || |
254 !iter.ReadBytes(&tab_navigation_data, tab_navigation_data_length)) { | 255 !iter.ReadBytes(&tab_navigation_data, tab_navigation_data_length)) { |
255 LOG(ERROR) | 256 LOG(ERROR) |
256 << "Failed to restore tab entry from byte array. " | 257 << "Failed to restore tab entry from byte array. " |
257 << "(SerializedNavigationEntry size=" << tab_navigation_data_length | 258 << "(SerializedNavigationEntry size=" << tab_navigation_data_length |
258 << ")."; | 259 << ")."; |
259 return false; // It's dangerous to keep deserializing now, give up. | 260 return false; // It's dangerous to keep deserializing now, give up. |
260 } | 261 } |
261 Pickle tab_navigation_pickle(tab_navigation_data, | 262 base::Pickle tab_navigation_pickle(tab_navigation_data, |
262 tab_navigation_data_length); | 263 tab_navigation_data_length); |
263 PickleIterator tab_navigation_pickle_iterator(tab_navigation_pickle); | 264 base::PickleIterator tab_navigation_pickle_iterator( |
| 265 tab_navigation_pickle); |
264 sessions::SerializedNavigationEntry nav; | 266 sessions::SerializedNavigationEntry nav; |
265 if (!nav.ReadFromPickle(&tab_navigation_pickle_iterator)) | 267 if (!nav.ReadFromPickle(&tab_navigation_pickle_iterator)) |
266 return false; // If we failed to read a navigation, give up on others. | 268 return false; // If we failed to read a navigation, give up on others. |
267 | 269 |
268 navigations->push_back(nav); | 270 navigations->push_back(nav); |
269 } | 271 } |
270 } | 272 } |
271 | 273 |
272 // Validate the data. | 274 // Validate the data. |
273 if (*current_entry_index < 0 || | 275 if (*current_entry_index < 0 || |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 } | 316 } |
315 | 317 |
316 // Common implementation for GetContentsStateAsByteBuffer() and | 318 // Common implementation for GetContentsStateAsByteBuffer() and |
317 // CreateContentsStateAsByteBuffer(). Does not assume ownership of the | 319 // CreateContentsStateAsByteBuffer(). Does not assume ownership of the |
318 // navigations. | 320 // navigations. |
319 ScopedJavaLocalRef<jobject> WebContentsState::WriteNavigationsAsByteBuffer( | 321 ScopedJavaLocalRef<jobject> WebContentsState::WriteNavigationsAsByteBuffer( |
320 JNIEnv* env, | 322 JNIEnv* env, |
321 bool is_off_the_record, | 323 bool is_off_the_record, |
322 const std::vector<content::NavigationEntry*>& navigations, | 324 const std::vector<content::NavigationEntry*>& navigations, |
323 int current_entry) { | 325 int current_entry) { |
324 Pickle pickle; | 326 base::Pickle pickle; |
325 if (!WriteStateHeaderToPickle(is_off_the_record, navigations.size(), | 327 if (!WriteStateHeaderToPickle(is_off_the_record, navigations.size(), |
326 current_entry, &pickle)) { | 328 current_entry, &pickle)) { |
327 LOG(ERROR) << "Failed to serialize tab state (entry count=" << | 329 LOG(ERROR) << "Failed to serialize tab state (entry count=" << |
328 navigations.size() << ")."; | 330 navigations.size() << ")."; |
329 return ScopedJavaLocalRef<jobject>(); | 331 return ScopedJavaLocalRef<jobject>(); |
330 } | 332 } |
331 | 333 |
332 // Write out all of the NavigationEntrys. | 334 // Write out all of the NavigationEntrys. |
333 for (size_t i = 0; i < navigations.size(); ++i) { | 335 for (size_t i = 0; i < navigations.size(); ++i) { |
334 // Write each SerializedNavigationEntry as a separate pickle to avoid | 336 // Write each SerializedNavigationEntry as a separate pickle to avoid |
335 // optional reads of one tab bleeding into the next tab's data. | 337 // optional reads of one tab bleeding into the next tab's data. |
336 Pickle tab_navigation_pickle; | 338 base::Pickle tab_navigation_pickle; |
337 // Max size taken from BaseSessionService::CreateUpdateTabNavigationCommand. | 339 // Max size taken from BaseSessionService::CreateUpdateTabNavigationCommand. |
338 static const size_t max_state_size = | 340 static const size_t max_state_size = |
339 std::numeric_limits<sessions::SessionCommand::size_type>::max() - 1024; | 341 std::numeric_limits<sessions::SessionCommand::size_type>::max() - 1024; |
340 sessions::ContentSerializedNavigationBuilder::FromNavigationEntry( | 342 sessions::ContentSerializedNavigationBuilder::FromNavigationEntry( |
341 i, *navigations[i]) | 343 i, *navigations[i]) |
342 .WriteToPickle(max_state_size, &tab_navigation_pickle); | 344 .WriteToPickle(max_state_size, &tab_navigation_pickle); |
343 pickle.WriteInt(tab_navigation_pickle.size()); | 345 pickle.WriteInt(tab_navigation_pickle.size()); |
344 pickle.WriteBytes(tab_navigation_pickle.data(), | 346 pickle.WriteBytes(tab_navigation_pickle.data(), |
345 tab_navigation_pickle.size()); | 347 tab_navigation_pickle.size()); |
346 } | 348 } |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 state, | 565 state, |
564 saved_state_version, | 566 saved_state_version, |
565 true)); | 567 true)); |
566 if (web_contents.get()) | 568 if (web_contents.get()) |
567 TabAndroid::CreateHistoricalTabFromContents(web_contents.get()); | 569 TabAndroid::CreateHistoricalTabFromContents(web_contents.get()); |
568 } | 570 } |
569 | 571 |
570 bool RegisterTabState(JNIEnv* env) { | 572 bool RegisterTabState(JNIEnv* env) { |
571 return RegisterNativesImpl(env); | 573 return RegisterNativesImpl(env); |
572 } | 574 } |
OLD | NEW |