Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: content/common/page_state_serialization.cc

Issue 2628683003: Add DidSaveScrollOrScaleState flag to prevent restoreScrollPositionAndViewState restore from default (Closed)
Patch Set: add dump file Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 pinch viewport scroll offset, the offset of the pinched zoomed 194 // 20: Add pinch 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.
199 // 200 //
200 // NOTE: If the version is -1, then the pickle contains only a URL string. 201 // NOTE: If the version is -1, then the pickle contains only a URL string.
201 // See ReadPageState. 202 // See ReadPageState.
202 // 203 //
203 const int kMinVersion = 11; 204 const int kMinVersion = 11;
204 const int kCurrentVersion = 23; 205 const int kCurrentVersion = 24;
205 206
206 // A bunch of convenience functions to read/write to SerializeObjects. The 207 // A bunch of convenience functions to read/write to SerializeObjects. The
207 // de-serializers assume the input data will be in the correct format and fall 208 // de-serializers assume the input data will be in the correct format and fall
208 // back to returning safe defaults when not. 209 // back to returning safe defaults when not.
209 210
210 void WriteData(const void* data, int length, SerializeObject* obj) { 211 void WriteData(const void* data, int length, SerializeObject* obj) {
211 obj->pickle.WriteData(static_cast<const char*>(data), length); 212 obj->pickle.WriteData(static_cast<const char*>(data), length);
212 } 213 }
213 214
214 void ReadData(SerializeObject* obj, const void** data, int* length) { 215 void ReadData(SerializeObject* obj, const void** data, int* length) {
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 void WriteFrameState( 499 void WriteFrameState(
499 const ExplodedFrameState& state, SerializeObject* obj, bool is_top) { 500 const ExplodedFrameState& state, SerializeObject* obj, bool is_top) {
500 // WARNING: This data may be persisted for later use. As such, care must be 501 // WARNING: This data may be persisted for later use. As such, care must be
501 // taken when changing the serialized format. If a new field needs to be 502 // taken when changing the serialized format. If a new field needs to be
502 // written, only adding at the end will make it easier to deal with loading 503 // written, only adding at the end will make it easier to deal with loading
503 // older versions. Similarly, this should NOT save fields with sensitive 504 // older versions. Similarly, this should NOT save fields with sensitive
504 // data, such as password fields. 505 // data, such as password fields.
505 506
506 WriteString(state.url_string, obj); 507 WriteString(state.url_string, obj);
507 WriteString(state.target, obj); 508 WriteString(state.target, obj);
508 WriteInteger(state.scroll_offset.x(), obj); 509 WriteBoolean(state.did_save_scroll_or_scale_state, obj);
509 WriteInteger(state.scroll_offset.y(), obj); 510
511 if (state.did_save_scroll_or_scale_state) {
512 WriteInteger(state.scroll_offset.x(), obj);
513 WriteInteger(state.scroll_offset.y(), obj);
514 }
515
510 WriteString(state.referrer, obj); 516 WriteString(state.referrer, obj);
511 517
512 WriteStringVector(state.document_state, obj); 518 WriteStringVector(state.document_state, obj);
513 519
514 WriteReal(state.page_scale_factor, obj); 520 if (state.did_save_scroll_or_scale_state)
521 WriteReal(state.page_scale_factor, obj);
522
515 WriteInteger64(state.item_sequence_number, obj); 523 WriteInteger64(state.item_sequence_number, obj);
516 WriteInteger64(state.document_sequence_number, obj); 524 WriteInteger64(state.document_sequence_number, obj);
517 WriteInteger(static_cast<int>(state.referrer_policy), obj); 525 WriteInteger(static_cast<int>(state.referrer_policy), obj);
518 WriteReal(state.visual_viewport_scroll_offset.x(), obj); 526
519 WriteReal(state.visual_viewport_scroll_offset.y(), obj); 527 if (state.did_save_scroll_or_scale_state) {
528 WriteReal(state.visual_viewport_scroll_offset.x(), obj);
529 WriteReal(state.visual_viewport_scroll_offset.y(), obj);
530 }
520 531
521 WriteInteger(state.scroll_restoration_type, obj); 532 WriteInteger(state.scroll_restoration_type, obj);
522 533
523 bool has_state_object = !state.state_object.is_null(); 534 bool has_state_object = !state.state_object.is_null();
524 WriteBoolean(has_state_object, obj); 535 WriteBoolean(has_state_object, obj);
525 if (has_state_object) 536 if (has_state_object)
526 WriteString(state.state_object, obj); 537 WriteString(state.state_object, obj);
527 538
528 WriteHttpBody(state.http_body, obj); 539 WriteHttpBody(state.http_body, obj);
529 540
(...skipping 20 matching lines...) Expand all
550 ReadString(obj); // Skip obsolete original url string field. 561 ReadString(obj); // Skip obsolete original url string field.
551 562
552 state->target = ReadString(obj); 563 state->target = ReadString(obj);
553 if (obj->version < 15) { 564 if (obj->version < 15) {
554 ReadString(obj); // Skip obsolete parent field. 565 ReadString(obj); // Skip obsolete parent field.
555 ReadString(obj); // Skip obsolete title field. 566 ReadString(obj); // Skip obsolete title field.
556 ReadString(obj); // Skip obsolete alternate title field. 567 ReadString(obj); // Skip obsolete alternate title field.
557 ReadReal(obj); // Skip obsolete visited time field. 568 ReadReal(obj); // Skip obsolete visited time field.
558 } 569 }
559 570
560 int x = ReadInteger(obj); 571 if (obj->version >= 24) {
561 int y = ReadInteger(obj); 572 state->did_save_scroll_or_scale_state = ReadBoolean(obj);
562 state->scroll_offset = gfx::Point(x, y); 573 } else {
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 }
563 582
564 if (obj->version < 15) { 583 if (obj->version < 15) {
565 ReadBoolean(obj); // Skip obsolete target item flag. 584 ReadBoolean(obj); // Skip obsolete target item flag.
566 ReadInteger(obj); // Skip obsolete visit count field. 585 ReadInteger(obj); // Skip obsolete visit count field.
567 } 586 }
568 state->referrer = ReadString(obj); 587 state->referrer = ReadString(obj);
569 588
570 ReadStringVector(obj, &state->document_state); 589 ReadStringVector(obj, &state->document_state);
571 590
572 state->page_scale_factor = ReadReal(obj); 591 if (state->did_save_scroll_or_scale_state)
592 state->page_scale_factor = ReadReal(obj);
593
573 state->item_sequence_number = ReadInteger64(obj); 594 state->item_sequence_number = ReadInteger64(obj);
574 state->document_sequence_number = ReadInteger64(obj); 595 state->document_sequence_number = ReadInteger64(obj);
575 if (obj->version >= 21 && obj->version < 23) 596 if (obj->version >= 21 && obj->version < 23)
576 ReadInteger64(obj); // Skip obsolete frame sequence number. 597 ReadInteger64(obj); // Skip obsolete frame sequence number.
577 598
578 if (obj->version >= 17 && obj->version < 19) 599 if (obj->version >= 17 && obj->version < 19)
579 ReadInteger64(obj); // Skip obsolete target frame id number. 600 ReadInteger64(obj); // Skip obsolete target frame id number.
580 601
581 if (obj->version >= 18) { 602 if (obj->version >= 18) {
582 state->referrer_policy = 603 state->referrer_policy =
583 static_cast<blink::WebReferrerPolicy>(ReadInteger(obj)); 604 static_cast<blink::WebReferrerPolicy>(ReadInteger(obj));
584 } 605 }
585 606
586 if (obj->version >= 20) { 607 if (obj->version >= 20 && state->did_save_scroll_or_scale_state) {
587 double x = ReadReal(obj); 608 double x = ReadReal(obj);
588 double y = ReadReal(obj); 609 double y = ReadReal(obj);
589 state->visual_viewport_scroll_offset = gfx::PointF(x, y); 610 state->visual_viewport_scroll_offset = gfx::PointF(x, y);
590 } else { 611 } else {
591 state->visual_viewport_scroll_offset = gfx::PointF(-1, -1); 612 state->visual_viewport_scroll_offset = gfx::PointF(-1, -1);
592 } 613 }
593 614
594 if (obj->version >= 22) { 615 if (obj->version >= 22) {
595 state->scroll_restoration_type = 616 state->scroll_restoration_type =
596 static_cast<blink::WebHistoryScrollRestorationType>(ReadInteger(obj)); 617 static_cast<blink::WebHistoryScrollRestorationType>(ReadInteger(obj));
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 703
683 } // namespace 704 } // namespace
684 705
685 ExplodedHttpBody::ExplodedHttpBody() : contains_passwords(false) {} 706 ExplodedHttpBody::ExplodedHttpBody() : contains_passwords(false) {}
686 707
687 ExplodedHttpBody::~ExplodedHttpBody() { 708 ExplodedHttpBody::~ExplodedHttpBody() {
688 } 709 }
689 710
690 ExplodedFrameState::ExplodedFrameState() 711 ExplodedFrameState::ExplodedFrameState()
691 : scroll_restoration_type(blink::WebHistoryScrollRestorationAuto), 712 : scroll_restoration_type(blink::WebHistoryScrollRestorationAuto),
713 did_save_scroll_or_scale_state(true),
692 item_sequence_number(0), 714 item_sequence_number(0),
693 document_sequence_number(0), 715 document_sequence_number(0),
694 page_scale_factor(0.0), 716 page_scale_factor(0.0),
695 referrer_policy(blink::WebReferrerPolicyDefault) { 717 referrer_policy(blink::WebReferrerPolicyDefault) {}
696 }
697 718
698 ExplodedFrameState::ExplodedFrameState(const ExplodedFrameState& other) { 719 ExplodedFrameState::ExplodedFrameState(const ExplodedFrameState& other) {
699 assign(other); 720 assign(other);
700 } 721 }
701 722
702 ExplodedFrameState::~ExplodedFrameState() { 723 ExplodedFrameState::~ExplodedFrameState() {
703 } 724 }
704 725
705 void ExplodedFrameState::operator=(const ExplodedFrameState& other) { 726 void ExplodedFrameState::operator=(const ExplodedFrameState& other) {
706 if (&other != this) 727 if (&other != this)
707 assign(other); 728 assign(other);
708 } 729 }
709 730
710 void ExplodedFrameState::assign(const ExplodedFrameState& other) { 731 void ExplodedFrameState::assign(const ExplodedFrameState& other) {
711 url_string = other.url_string; 732 url_string = other.url_string;
712 referrer = other.referrer; 733 referrer = other.referrer;
713 target = other.target; 734 target = other.target;
714 state_object = other.state_object; 735 state_object = other.state_object;
715 document_state = other.document_state; 736 document_state = other.document_state;
716 scroll_restoration_type = other.scroll_restoration_type; 737 scroll_restoration_type = other.scroll_restoration_type;
738 did_save_scroll_or_scale_state = other.did_save_scroll_or_scale_state;
717 visual_viewport_scroll_offset = other.visual_viewport_scroll_offset; 739 visual_viewport_scroll_offset = other.visual_viewport_scroll_offset;
718 scroll_offset = other.scroll_offset; 740 scroll_offset = other.scroll_offset;
719 item_sequence_number = other.item_sequence_number; 741 item_sequence_number = other.item_sequence_number;
720 document_sequence_number = other.document_sequence_number; 742 document_sequence_number = other.document_sequence_number;
721 page_scale_factor = other.page_scale_factor; 743 page_scale_factor = other.page_scale_factor;
722 referrer_policy = other.referrer_policy; 744 referrer_policy = other.referrer_policy;
723 http_body = other.http_body; 745 http_body = other.http_body;
724 children = other.children; 746 children = other.children;
725 } 747 }
726 748
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 // because it covers additional data (e.g.|contains_sensitive_info|) which 803 // because it covers additional data (e.g.|contains_sensitive_info|) which
782 // is marshaled between native code and java. WriteResourceRequestBody() 804 // is marshaled between native code and java. WriteResourceRequestBody()
783 // serializes data which needs to be saved out to disk. 805 // serializes data which needs to be saved out to disk.
784 WriteBoolean(resource_request_body.contains_sensitive_info(), &obj); 806 WriteBoolean(resource_request_body.contains_sensitive_info(), &obj);
785 return obj.GetAsString(); 807 return obj.GetAsString();
786 } 808 }
787 809
788 #endif 810 #endif
789 811
790 } // namespace content 812 } // namespace content
OLDNEW
« no previous file with comments | « content/common/page_state_serialization.h ('k') | content/common/page_state_serialization_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698