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 |