| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 // 16: Switched from blob urls to blob uuids. | 189 // 16: Switched from blob urls to blob uuids. |
| 190 // 17: Add a target frame id number. | 190 // 17: Add a target frame id number. |
| 191 // 18: Add referrer policy. | 191 // 18: Add referrer policy. |
| 192 // 19: Remove target frame id, which was a bad idea, and original url string, | 192 // 19: Remove target frame id, which was a bad idea, and original url string, |
| 193 // which is no longer used. | 193 // which is no longer used. |
| 194 // 20: Add visual viewport scroll offset, the offset of the pinched zoomed | 194 // 20: Add visual viewport scroll offset, the offset of the pinched zoomed |
| 195 // viewport within the unzoomed main frame. | 195 // viewport within the unzoomed main frame. |
| 196 // 21: Add frame sequence number. | 196 // 21: Add frame sequence number. |
| 197 // 22: Add scroll restoration type. | 197 // 22: Add scroll restoration type. |
| 198 // 23: Remove frame sequence number, there are easier ways. | 198 // 23: Remove frame sequence number, there are easier ways. |
| 199 // 24: Add did save scroll or scale state. | |
| 200 // | 199 // |
| 201 // NOTE: If the version is -1, then the pickle contains only a URL string. | 200 // NOTE: If the version is -1, then the pickle contains only a URL string. |
| 202 // See ReadPageState. | 201 // See ReadPageState. |
| 203 // | 202 // |
| 204 const int kMinVersion = 11; | 203 const int kMinVersion = 11; |
| 205 const int kCurrentVersion = 24; | 204 const int kCurrentVersion = 23; |
| 206 | 205 |
| 207 // A bunch of convenience functions to read/write to SerializeObjects. The | 206 // A bunch of convenience functions to read/write to SerializeObjects. The |
| 208 // de-serializers assume the input data will be in the correct format and fall | 207 // de-serializers assume the input data will be in the correct format and fall |
| 209 // back to returning safe defaults when not. | 208 // back to returning safe defaults when not. |
| 210 | 209 |
| 211 void WriteData(const void* data, int length, SerializeObject* obj) { | 210 void WriteData(const void* data, int length, SerializeObject* obj) { |
| 212 obj->pickle.WriteData(static_cast<const char*>(data), length); | 211 obj->pickle.WriteData(static_cast<const char*>(data), length); |
| 213 } | 212 } |
| 214 | 213 |
| 215 void ReadData(SerializeObject* obj, const void** data, int* length) { | 214 void ReadData(SerializeObject* obj, const void** data, int* length) { |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 void WriteFrameState( | 498 void WriteFrameState( |
| 500 const ExplodedFrameState& state, SerializeObject* obj, bool is_top) { | 499 const ExplodedFrameState& state, SerializeObject* obj, bool is_top) { |
| 501 // WARNING: This data may be persisted for later use. As such, care must be | 500 // WARNING: This data may be persisted for later use. As such, care must be |
| 502 // taken when changing the serialized format. If a new field needs to be | 501 // taken when changing the serialized format. If a new field needs to be |
| 503 // written, only adding at the end will make it easier to deal with loading | 502 // written, only adding at the end will make it easier to deal with loading |
| 504 // older versions. Similarly, this should NOT save fields with sensitive | 503 // older versions. Similarly, this should NOT save fields with sensitive |
| 505 // data, such as password fields. | 504 // data, such as password fields. |
| 506 | 505 |
| 507 WriteString(state.url_string, obj); | 506 WriteString(state.url_string, obj); |
| 508 WriteString(state.target, obj); | 507 WriteString(state.target, obj); |
| 509 WriteBoolean(state.did_save_scroll_or_scale_state, obj); | |
| 510 | 508 |
| 511 if (state.did_save_scroll_or_scale_state) { | 509 WriteInteger(state.scroll_offset.x(), obj); |
| 512 WriteInteger(state.scroll_offset.x(), obj); | 510 WriteInteger(state.scroll_offset.y(), obj); |
| 513 WriteInteger(state.scroll_offset.y(), obj); | |
| 514 } | |
| 515 | 511 |
| 516 WriteString(state.referrer, obj); | 512 WriteString(state.referrer, obj); |
| 517 | 513 |
| 518 WriteStringVector(state.document_state, obj); | 514 WriteStringVector(state.document_state, obj); |
| 519 | 515 |
| 520 if (state.did_save_scroll_or_scale_state) | 516 WriteReal(state.page_scale_factor, obj); |
| 521 WriteReal(state.page_scale_factor, obj); | |
| 522 | 517 |
| 523 WriteInteger64(state.item_sequence_number, obj); | 518 WriteInteger64(state.item_sequence_number, obj); |
| 524 WriteInteger64(state.document_sequence_number, obj); | 519 WriteInteger64(state.document_sequence_number, obj); |
| 525 WriteInteger(static_cast<int>(state.referrer_policy), obj); | 520 WriteInteger(static_cast<int>(state.referrer_policy), obj); |
| 526 | 521 |
| 527 if (state.did_save_scroll_or_scale_state) { | 522 WriteReal(state.visual_viewport_scroll_offset.x(), obj); |
| 528 WriteReal(state.visual_viewport_scroll_offset.x(), obj); | 523 WriteReal(state.visual_viewport_scroll_offset.y(), obj); |
| 529 WriteReal(state.visual_viewport_scroll_offset.y(), obj); | |
| 530 } | |
| 531 | 524 |
| 532 WriteInteger(state.scroll_restoration_type, obj); | 525 WriteInteger(state.scroll_restoration_type, obj); |
| 533 | 526 |
| 534 bool has_state_object = !state.state_object.is_null(); | 527 bool has_state_object = !state.state_object.is_null(); |
| 535 WriteBoolean(has_state_object, obj); | 528 WriteBoolean(has_state_object, obj); |
| 536 if (has_state_object) | 529 if (has_state_object) |
| 537 WriteString(state.state_object, obj); | 530 WriteString(state.state_object, obj); |
| 538 | 531 |
| 539 WriteHttpBody(state.http_body, obj); | 532 WriteHttpBody(state.http_body, obj); |
| 540 | 533 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 561 ReadString(obj); // Skip obsolete original url string field. | 554 ReadString(obj); // Skip obsolete original url string field. |
| 562 | 555 |
| 563 state->target = ReadString(obj); | 556 state->target = ReadString(obj); |
| 564 if (obj->version < 15) { | 557 if (obj->version < 15) { |
| 565 ReadString(obj); // Skip obsolete parent field. | 558 ReadString(obj); // Skip obsolete parent field. |
| 566 ReadString(obj); // Skip obsolete title field. | 559 ReadString(obj); // Skip obsolete title field. |
| 567 ReadString(obj); // Skip obsolete alternate title field. | 560 ReadString(obj); // Skip obsolete alternate title field. |
| 568 ReadReal(obj); // Skip obsolete visited time field. | 561 ReadReal(obj); // Skip obsolete visited time field. |
| 569 } | 562 } |
| 570 | 563 |
| 571 if (obj->version >= 24) { | 564 int x = ReadInteger(obj); |
| 572 state->did_save_scroll_or_scale_state = ReadBoolean(obj); | 565 int y = ReadInteger(obj); |
| 573 } else { | 566 state->scroll_offset = gfx::Point(x, y); |
| 574 state->did_save_scroll_or_scale_state = true; | |
| 575 } | |
| 576 | |
| 577 if (state->did_save_scroll_or_scale_state) { | |
| 578 int x = ReadInteger(obj); | |
| 579 int y = ReadInteger(obj); | |
| 580 state->scroll_offset = gfx::Point(x, y); | |
| 581 } | |
| 582 | 567 |
| 583 if (obj->version < 15) { | 568 if (obj->version < 15) { |
| 584 ReadBoolean(obj); // Skip obsolete target item flag. | 569 ReadBoolean(obj); // Skip obsolete target item flag. |
| 585 ReadInteger(obj); // Skip obsolete visit count field. | 570 ReadInteger(obj); // Skip obsolete visit count field. |
| 586 } | 571 } |
| 587 state->referrer = ReadString(obj); | 572 state->referrer = ReadString(obj); |
| 588 | 573 |
| 589 ReadStringVector(obj, &state->document_state); | 574 ReadStringVector(obj, &state->document_state); |
| 590 | 575 |
| 591 if (state->did_save_scroll_or_scale_state) | 576 state->page_scale_factor = ReadReal(obj); |
| 592 state->page_scale_factor = ReadReal(obj); | |
| 593 | 577 |
| 594 state->item_sequence_number = ReadInteger64(obj); | 578 state->item_sequence_number = ReadInteger64(obj); |
| 595 state->document_sequence_number = ReadInteger64(obj); | 579 state->document_sequence_number = ReadInteger64(obj); |
| 596 if (obj->version >= 21 && obj->version < 23) | 580 if (obj->version >= 21 && obj->version < 23) |
| 597 ReadInteger64(obj); // Skip obsolete frame sequence number. | 581 ReadInteger64(obj); // Skip obsolete frame sequence number. |
| 598 | 582 |
| 599 if (obj->version >= 17 && obj->version < 19) | 583 if (obj->version >= 17 && obj->version < 19) |
| 600 ReadInteger64(obj); // Skip obsolete target frame id number. | 584 ReadInteger64(obj); // Skip obsolete target frame id number. |
| 601 | 585 |
| 602 if (obj->version >= 18) { | 586 if (obj->version >= 18) { |
| 603 state->referrer_policy = | 587 state->referrer_policy = |
| 604 static_cast<blink::WebReferrerPolicy>(ReadInteger(obj)); | 588 static_cast<blink::WebReferrerPolicy>(ReadInteger(obj)); |
| 605 } | 589 } |
| 606 | 590 |
| 607 if (obj->version >= 20 && state->did_save_scroll_or_scale_state) { | 591 if (obj->version >= 20) { |
| 608 double x = ReadReal(obj); | 592 double x = ReadReal(obj); |
| 609 double y = ReadReal(obj); | 593 double y = ReadReal(obj); |
| 610 state->visual_viewport_scroll_offset = gfx::PointF(x, y); | 594 state->visual_viewport_scroll_offset = gfx::PointF(x, y); |
| 611 } else { | 595 } else { |
| 612 state->visual_viewport_scroll_offset = gfx::PointF(-1, -1); | 596 state->visual_viewport_scroll_offset = gfx::PointF(-1, -1); |
| 613 } | 597 } |
| 614 | 598 |
| 615 if (obj->version >= 22) { | 599 if (obj->version >= 22) { |
| 616 state->scroll_restoration_type = | 600 state->scroll_restoration_type = |
| 617 static_cast<blink::WebHistoryScrollRestorationType>(ReadInteger(obj)); | 601 static_cast<blink::WebHistoryScrollRestorationType>(ReadInteger(obj)); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 | 687 |
| 704 } // namespace | 688 } // namespace |
| 705 | 689 |
| 706 ExplodedHttpBody::ExplodedHttpBody() : contains_passwords(false) {} | 690 ExplodedHttpBody::ExplodedHttpBody() : contains_passwords(false) {} |
| 707 | 691 |
| 708 ExplodedHttpBody::~ExplodedHttpBody() { | 692 ExplodedHttpBody::~ExplodedHttpBody() { |
| 709 } | 693 } |
| 710 | 694 |
| 711 ExplodedFrameState::ExplodedFrameState() | 695 ExplodedFrameState::ExplodedFrameState() |
| 712 : scroll_restoration_type(blink::kWebHistoryScrollRestorationAuto), | 696 : scroll_restoration_type(blink::kWebHistoryScrollRestorationAuto), |
| 713 did_save_scroll_or_scale_state(true), | |
| 714 item_sequence_number(0), | 697 item_sequence_number(0), |
| 715 document_sequence_number(0), | 698 document_sequence_number(0), |
| 716 page_scale_factor(0.0), | 699 page_scale_factor(0.0), |
| 717 referrer_policy(blink::kWebReferrerPolicyDefault) {} | 700 referrer_policy(blink::kWebReferrerPolicyDefault) {} |
| 718 | 701 |
| 719 ExplodedFrameState::ExplodedFrameState(const ExplodedFrameState& other) { | 702 ExplodedFrameState::ExplodedFrameState(const ExplodedFrameState& other) { |
| 720 assign(other); | 703 assign(other); |
| 721 } | 704 } |
| 722 | 705 |
| 723 ExplodedFrameState::~ExplodedFrameState() { | 706 ExplodedFrameState::~ExplodedFrameState() { |
| 724 } | 707 } |
| 725 | 708 |
| 726 void ExplodedFrameState::operator=(const ExplodedFrameState& other) { | 709 void ExplodedFrameState::operator=(const ExplodedFrameState& other) { |
| 727 if (&other != this) | 710 if (&other != this) |
| 728 assign(other); | 711 assign(other); |
| 729 } | 712 } |
| 730 | 713 |
| 731 void ExplodedFrameState::assign(const ExplodedFrameState& other) { | 714 void ExplodedFrameState::assign(const ExplodedFrameState& other) { |
| 732 url_string = other.url_string; | 715 url_string = other.url_string; |
| 733 referrer = other.referrer; | 716 referrer = other.referrer; |
| 734 target = other.target; | 717 target = other.target; |
| 735 state_object = other.state_object; | 718 state_object = other.state_object; |
| 736 document_state = other.document_state; | 719 document_state = other.document_state; |
| 737 scroll_restoration_type = other.scroll_restoration_type; | 720 scroll_restoration_type = other.scroll_restoration_type; |
| 738 did_save_scroll_or_scale_state = other.did_save_scroll_or_scale_state; | |
| 739 visual_viewport_scroll_offset = other.visual_viewport_scroll_offset; | 721 visual_viewport_scroll_offset = other.visual_viewport_scroll_offset; |
| 740 scroll_offset = other.scroll_offset; | 722 scroll_offset = other.scroll_offset; |
| 741 item_sequence_number = other.item_sequence_number; | 723 item_sequence_number = other.item_sequence_number; |
| 742 document_sequence_number = other.document_sequence_number; | 724 document_sequence_number = other.document_sequence_number; |
| 743 page_scale_factor = other.page_scale_factor; | 725 page_scale_factor = other.page_scale_factor; |
| 744 referrer_policy = other.referrer_policy; | 726 referrer_policy = other.referrer_policy; |
| 745 http_body = other.http_body; | 727 http_body = other.http_body; |
| 746 children = other.children; | 728 children = other.children; |
| 747 } | 729 } |
| 748 | 730 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 // because it covers additional data (e.g.|contains_sensitive_info|) which | 785 // because it covers additional data (e.g.|contains_sensitive_info|) which |
| 804 // is marshaled between native code and java. WriteResourceRequestBody() | 786 // is marshaled between native code and java. WriteResourceRequestBody() |
| 805 // serializes data which needs to be saved out to disk. | 787 // serializes data which needs to be saved out to disk. |
| 806 WriteBoolean(resource_request_body.contains_sensitive_info(), &obj); | 788 WriteBoolean(resource_request_body.contains_sensitive_info(), &obj); |
| 807 return obj.GetAsString(); | 789 return obj.GetAsString(); |
| 808 } | 790 } |
| 809 | 791 |
| 810 #endif | 792 #endif |
| 811 | 793 |
| 812 } // namespace content | 794 } // namespace content |
| OLD | NEW |