| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/common/page_state_serialization.h" | 5 #include "content/common/page_state_serialization.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/pickle.h" | 10 #include "base/pickle.h" |
| 11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "ui/gfx/screen.h" | 14 #include "ui/gfx/screen.h" |
| 15 | 15 |
| 16 namespace content { | 16 namespace content { |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 #if defined(OS_ANDROID) | 19 #if defined(OS_ANDROID) |
| 20 float g_device_scale_factor_for_testing = 0.0; | 20 float g_device_scale_factor_for_testing = 0.0; |
| 21 #endif | 21 #endif |
| 22 | 22 |
| 23 //----------------------------------------------------------------------------- | 23 //----------------------------------------------------------------------------- |
| 24 | 24 |
| 25 void AppendDataToHttpBody(ExplodedHttpBody* http_body, const char* data, | 25 void AppendDataToHttpBody(ExplodedHttpBody* http_body, const char* data, |
| 26 int data_length) { | 26 int data_length) { |
| 27 ExplodedHttpBodyElement element; | 27 ExplodedHttpBodyElement element; |
| 28 element.type = WebKit::WebHTTPBody::Element::TypeData; | 28 element.type = blink::WebHTTPBody::Element::TypeData; |
| 29 element.data.assign(data, data_length); | 29 element.data.assign(data, data_length); |
| 30 http_body->elements.push_back(element); | 30 http_body->elements.push_back(element); |
| 31 } | 31 } |
| 32 | 32 |
| 33 void AppendFileRangeToHttpBody(ExplodedHttpBody* http_body, | 33 void AppendFileRangeToHttpBody(ExplodedHttpBody* http_body, |
| 34 const base::NullableString16& file_path, | 34 const base::NullableString16& file_path, |
| 35 int file_start, | 35 int file_start, |
| 36 int file_length, | 36 int file_length, |
| 37 double file_modification_time) { | 37 double file_modification_time) { |
| 38 ExplodedHttpBodyElement element; | 38 ExplodedHttpBodyElement element; |
| 39 element.type = WebKit::WebHTTPBody::Element::TypeFile; | 39 element.type = blink::WebHTTPBody::Element::TypeFile; |
| 40 element.file_path = file_path; | 40 element.file_path = file_path; |
| 41 element.file_start = file_start; | 41 element.file_start = file_start; |
| 42 element.file_length = file_length; | 42 element.file_length = file_length; |
| 43 element.file_modification_time = file_modification_time; | 43 element.file_modification_time = file_modification_time; |
| 44 http_body->elements.push_back(element); | 44 http_body->elements.push_back(element); |
| 45 } | 45 } |
| 46 | 46 |
| 47 void AppendURLRangeToHttpBody(ExplodedHttpBody* http_body, | 47 void AppendURLRangeToHttpBody(ExplodedHttpBody* http_body, |
| 48 const GURL& url, | 48 const GURL& url, |
| 49 int file_start, | 49 int file_start, |
| 50 int file_length, | 50 int file_length, |
| 51 double file_modification_time) { | 51 double file_modification_time) { |
| 52 ExplodedHttpBodyElement element; | 52 ExplodedHttpBodyElement element; |
| 53 element.type = WebKit::WebHTTPBody::Element::TypeFileSystemURL; | 53 element.type = blink::WebHTTPBody::Element::TypeFileSystemURL; |
| 54 element.filesystem_url = url; | 54 element.filesystem_url = url; |
| 55 element.file_start = file_start; | 55 element.file_start = file_start; |
| 56 element.file_length = file_length; | 56 element.file_length = file_length; |
| 57 element.file_modification_time = file_modification_time; | 57 element.file_modification_time = file_modification_time; |
| 58 http_body->elements.push_back(element); | 58 http_body->elements.push_back(element); |
| 59 } | 59 } |
| 60 | 60 |
| 61 void AppendBlobToHttpBody(ExplodedHttpBody* http_body, | 61 void AppendBlobToHttpBody(ExplodedHttpBody* http_body, |
| 62 const std::string& uuid) { | 62 const std::string& uuid) { |
| 63 ExplodedHttpBodyElement element; | 63 ExplodedHttpBodyElement element; |
| 64 element.type = WebKit::WebHTTPBody::Element::TypeBlob; | 64 element.type = blink::WebHTTPBody::Element::TypeBlob; |
| 65 element.blob_uuid = uuid; | 65 element.blob_uuid = uuid; |
| 66 http_body->elements.push_back(element); | 66 http_body->elements.push_back(element); |
| 67 } | 67 } |
| 68 | 68 |
| 69 //---------------------------------------------------------------------------- | 69 //---------------------------------------------------------------------------- |
| 70 | 70 |
| 71 void AppendReferencedFilesFromHttpBody( | 71 void AppendReferencedFilesFromHttpBody( |
| 72 const std::vector<ExplodedHttpBodyElement>& elements, | 72 const std::vector<ExplodedHttpBodyElement>& elements, |
| 73 std::vector<base::NullableString16>* referenced_files) { | 73 std::vector<base::NullableString16>* referenced_files) { |
| 74 for (size_t i = 0; i < elements.size(); ++i) { | 74 for (size_t i = 0; i < elements.size(); ++i) { |
| 75 if (elements[i].type == WebKit::WebHTTPBody::Element::TypeFile) | 75 if (elements[i].type == blink::WebHTTPBody::Element::TypeFile) |
| 76 referenced_files->push_back(elements[i].file_path); | 76 referenced_files->push_back(elements[i].file_path); |
| 77 } | 77 } |
| 78 } | 78 } |
| 79 | 79 |
| 80 bool AppendReferencedFilesFromDocumentState( | 80 bool AppendReferencedFilesFromDocumentState( |
| 81 const std::vector<base::NullableString16>& document_state, | 81 const std::vector<base::NullableString16>& document_state, |
| 82 std::vector<base::NullableString16>* referenced_files) { | 82 std::vector<base::NullableString16>* referenced_files) { |
| 83 if (document_state.empty()) | 83 if (document_state.empty()) |
| 84 return true; | 84 return true; |
| 85 | 85 |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 void WriteHttpBody(const ExplodedHttpBody& http_body, SerializeObject* obj) { | 404 void WriteHttpBody(const ExplodedHttpBody& http_body, SerializeObject* obj) { |
| 405 WriteBoolean(!http_body.is_null, obj); | 405 WriteBoolean(!http_body.is_null, obj); |
| 406 | 406 |
| 407 if (http_body.is_null) | 407 if (http_body.is_null) |
| 408 return; | 408 return; |
| 409 | 409 |
| 410 WriteAndValidateVectorSize(http_body.elements, obj); | 410 WriteAndValidateVectorSize(http_body.elements, obj); |
| 411 for (size_t i = 0; i < http_body.elements.size(); ++i) { | 411 for (size_t i = 0; i < http_body.elements.size(); ++i) { |
| 412 const ExplodedHttpBodyElement& element = http_body.elements[i]; | 412 const ExplodedHttpBodyElement& element = http_body.elements[i]; |
| 413 WriteInteger(element.type, obj); | 413 WriteInteger(element.type, obj); |
| 414 if (element.type == WebKit::WebHTTPBody::Element::TypeData) { | 414 if (element.type == blink::WebHTTPBody::Element::TypeData) { |
| 415 WriteData(element.data.data(), static_cast<int>(element.data.size()), | 415 WriteData(element.data.data(), static_cast<int>(element.data.size()), |
| 416 obj); | 416 obj); |
| 417 } else if (element.type == WebKit::WebHTTPBody::Element::TypeFile) { | 417 } else if (element.type == blink::WebHTTPBody::Element::TypeFile) { |
| 418 WriteString(element.file_path, obj); | 418 WriteString(element.file_path, obj); |
| 419 WriteInteger64(element.file_start, obj); | 419 WriteInteger64(element.file_start, obj); |
| 420 WriteInteger64(element.file_length, obj); | 420 WriteInteger64(element.file_length, obj); |
| 421 WriteReal(element.file_modification_time, obj); | 421 WriteReal(element.file_modification_time, obj); |
| 422 } else if (element.type == | 422 } else if (element.type == |
| 423 WebKit::WebHTTPBody::Element::TypeFileSystemURL) { | 423 blink::WebHTTPBody::Element::TypeFileSystemURL) { |
| 424 WriteGURL(element.filesystem_url, obj); | 424 WriteGURL(element.filesystem_url, obj); |
| 425 WriteInteger64(element.file_start, obj); | 425 WriteInteger64(element.file_start, obj); |
| 426 WriteInteger64(element.file_length, obj); | 426 WriteInteger64(element.file_length, obj); |
| 427 WriteReal(element.file_modification_time, obj); | 427 WriteReal(element.file_modification_time, obj); |
| 428 } else { | 428 } else { |
| 429 DCHECK(element.type == WebKit::WebHTTPBody::Element::TypeBlob); | 429 DCHECK(element.type == blink::WebHTTPBody::Element::TypeBlob); |
| 430 WriteStdString(element.blob_uuid, obj); | 430 WriteStdString(element.blob_uuid, obj); |
| 431 } | 431 } |
| 432 } | 432 } |
| 433 WriteInteger64(http_body.identifier, obj); | 433 WriteInteger64(http_body.identifier, obj); |
| 434 WriteBoolean(http_body.contains_passwords, obj); | 434 WriteBoolean(http_body.contains_passwords, obj); |
| 435 } | 435 } |
| 436 | 436 |
| 437 void ReadHttpBody(SerializeObject* obj, ExplodedHttpBody* http_body) { | 437 void ReadHttpBody(SerializeObject* obj, ExplodedHttpBody* http_body) { |
| 438 // An initial boolean indicates if we have an HTTP body. | 438 // An initial boolean indicates if we have an HTTP body. |
| 439 if (!ReadBoolean(obj)) | 439 if (!ReadBoolean(obj)) |
| 440 return; | 440 return; |
| 441 http_body->is_null = false; | 441 http_body->is_null = false; |
| 442 | 442 |
| 443 int num_elements = ReadInteger(obj); | 443 int num_elements = ReadInteger(obj); |
| 444 | 444 |
| 445 for (int i = 0; i < num_elements; ++i) { | 445 for (int i = 0; i < num_elements; ++i) { |
| 446 int type = ReadInteger(obj); | 446 int type = ReadInteger(obj); |
| 447 if (type == WebKit::WebHTTPBody::Element::TypeData) { | 447 if (type == blink::WebHTTPBody::Element::TypeData) { |
| 448 const void* data; | 448 const void* data; |
| 449 int length = -1; | 449 int length = -1; |
| 450 ReadData(obj, &data, &length); | 450 ReadData(obj, &data, &length); |
| 451 if (length >= 0) { | 451 if (length >= 0) { |
| 452 AppendDataToHttpBody(http_body, static_cast<const char*>(data), | 452 AppendDataToHttpBody(http_body, static_cast<const char*>(data), |
| 453 length); | 453 length); |
| 454 } | 454 } |
| 455 } else if (type == WebKit::WebHTTPBody::Element::TypeFile) { | 455 } else if (type == blink::WebHTTPBody::Element::TypeFile) { |
| 456 base::NullableString16 file_path = ReadString(obj); | 456 base::NullableString16 file_path = ReadString(obj); |
| 457 int64 file_start = ReadInteger64(obj); | 457 int64 file_start = ReadInteger64(obj); |
| 458 int64 file_length = ReadInteger64(obj); | 458 int64 file_length = ReadInteger64(obj); |
| 459 double file_modification_time = ReadReal(obj); | 459 double file_modification_time = ReadReal(obj); |
| 460 AppendFileRangeToHttpBody(http_body, file_path, file_start, file_length, | 460 AppendFileRangeToHttpBody(http_body, file_path, file_start, file_length, |
| 461 file_modification_time); | 461 file_modification_time); |
| 462 } else if (type == WebKit::WebHTTPBody::Element::TypeFileSystemURL) { | 462 } else if (type == blink::WebHTTPBody::Element::TypeFileSystemURL) { |
| 463 GURL url = ReadGURL(obj); | 463 GURL url = ReadGURL(obj); |
| 464 int64 file_start = ReadInteger64(obj); | 464 int64 file_start = ReadInteger64(obj); |
| 465 int64 file_length = ReadInteger64(obj); | 465 int64 file_length = ReadInteger64(obj); |
| 466 double file_modification_time = ReadReal(obj); | 466 double file_modification_time = ReadReal(obj); |
| 467 AppendURLRangeToHttpBody(http_body, url, file_start, file_length, | 467 AppendURLRangeToHttpBody(http_body, url, file_start, file_length, |
| 468 file_modification_time); | 468 file_modification_time); |
| 469 } else if (type == WebKit::WebHTTPBody::Element::TypeBlob) { | 469 } else if (type == blink::WebHTTPBody::Element::TypeBlob) { |
| 470 if (obj->version >= 16) { | 470 if (obj->version >= 16) { |
| 471 std::string blob_uuid = ReadStdString(obj); | 471 std::string blob_uuid = ReadStdString(obj); |
| 472 AppendBlobToHttpBody(http_body, blob_uuid); | 472 AppendBlobToHttpBody(http_body, blob_uuid); |
| 473 } else { | 473 } else { |
| 474 ReadGURL(obj); // Skip the obsolete blob url value. | 474 ReadGURL(obj); // Skip the obsolete blob url value. |
| 475 } | 475 } |
| 476 } | 476 } |
| 477 } | 477 } |
| 478 http_body->identifier = ReadInteger64(obj); | 478 http_body->identifier = ReadInteger64(obj); |
| 479 | 479 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 // De-dupe | 636 // De-dupe |
| 637 state->referenced_files.erase( | 637 state->referenced_files.erase( |
| 638 std::unique(state->referenced_files.begin(), | 638 std::unique(state->referenced_files.begin(), |
| 639 state->referenced_files.end()), | 639 state->referenced_files.end()), |
| 640 state->referenced_files.end()); | 640 state->referenced_files.end()); |
| 641 } | 641 } |
| 642 | 642 |
| 643 } // namespace | 643 } // namespace |
| 644 | 644 |
| 645 ExplodedHttpBodyElement::ExplodedHttpBodyElement() | 645 ExplodedHttpBodyElement::ExplodedHttpBodyElement() |
| 646 : type(WebKit::WebHTTPBody::Element::TypeData), | 646 : type(blink::WebHTTPBody::Element::TypeData), |
| 647 file_start(0), | 647 file_start(0), |
| 648 file_length(-1), | 648 file_length(-1), |
| 649 file_modification_time(std::numeric_limits<double>::quiet_NaN()) { | 649 file_modification_time(std::numeric_limits<double>::quiet_NaN()) { |
| 650 } | 650 } |
| 651 | 651 |
| 652 ExplodedHttpBodyElement::~ExplodedHttpBodyElement() { | 652 ExplodedHttpBodyElement::~ExplodedHttpBodyElement() { |
| 653 } | 653 } |
| 654 | 654 |
| 655 ExplodedHttpBody::ExplodedHttpBody() | 655 ExplodedHttpBody::ExplodedHttpBody() |
| 656 : identifier(0), | 656 : identifier(0), |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 float device_scale_factor, | 702 float device_scale_factor, |
| 703 ExplodedPageState* exploded) { | 703 ExplodedPageState* exploded) { |
| 704 g_device_scale_factor_for_testing = device_scale_factor; | 704 g_device_scale_factor_for_testing = device_scale_factor; |
| 705 bool rv = DecodePageState(encoded, exploded); | 705 bool rv = DecodePageState(encoded, exploded); |
| 706 g_device_scale_factor_for_testing = 0.0; | 706 g_device_scale_factor_for_testing = 0.0; |
| 707 return rv; | 707 return rv; |
| 708 } | 708 } |
| 709 #endif | 709 #endif |
| 710 | 710 |
| 711 } // namespace content | 711 } // namespace content |
| OLD | NEW |