Commit bbac25a6 authored by majidvp's avatar majidvp Committed by Commit bot

Add scroll restoration type to page state

The scroll restoration type is added to page state and serialized. It is used
by blink to control the scroll/scale restoration behaviour for history
entries. Its value may be provided by user via web-exposed API.

Blink side CL: http://crrev.com/927213004

BUG=444094

Review URL: https://codereview.chromium.org/959783003

Cr-Commit-Position: refs/heads/master@{#329632}
parent 43183dd5
......@@ -19,6 +19,7 @@ include_rules = [
"+third_party/WebKit/public/platform/WebGamepads.h",
"+third_party/WebKit/public/platform/WebGeofencingEventType.h",
"+third_party/WebKit/public/platform/WebGraphicsContext3D.h",
"+third_party/WebKit/public/platform/WebHistoryScrollRestorationType.h",
"+third_party/WebKit/public/platform/WebHTTPBody.h",
"+third_party/WebKit/public/platform/WebLockOrientationError.h",
"+third_party/WebKit/public/platform/WebPageVisibilityState.h",
......
......@@ -193,13 +193,14 @@ struct SerializeObject {
// which is no longer used.
// 20: Add pinch viewport scroll offset, the offset of the pinched zoomed
// viewport within the unzoomed main frame.
// 21: Add frame sequence number
// 21: Add frame sequence number.
// 22: Add scroll restoration type.
//
// NOTE: If the version is -1, then the pickle contains only a URL string.
// See ReadPageState.
//
const int kMinVersion = 11;
const int kCurrentVersion = 21;
const int kCurrentVersion = 22;
// A bunch of convenience functions to read/write to SerializeObjects. The
// de-serializers assume the input data will be in the correct format and fall
......@@ -497,6 +498,8 @@ void WriteFrameState(
WriteReal(state.pinch_viewport_scroll_offset.x(), obj);
WriteReal(state.pinch_viewport_scroll_offset.y(), obj);
WriteInteger(state.scroll_restoration_type, obj);
bool has_state_object = !state.state_object.is_null();
WriteBoolean(has_state_object, obj);
if (has_state_object)
......@@ -568,6 +571,11 @@ void ReadFrameState(SerializeObject* obj, bool is_top,
state->pinch_viewport_scroll_offset = gfx::PointF(-1, -1);
}
if (obj->version >= 22) {
state->scroll_restoration_type =
static_cast<blink::WebHistoryScrollRestorationType>(ReadInteger(obj));
}
bool has_state_object = ReadBoolean(obj);
if (has_state_object)
state->state_object = ReadString(obj);
......@@ -674,7 +682,8 @@ ExplodedHttpBody::~ExplodedHttpBody() {
}
ExplodedFrameState::ExplodedFrameState()
: item_sequence_number(0),
: scroll_restoration_type(blink::WebHistoryScrollRestorationAuto),
item_sequence_number(0),
document_sequence_number(0),
frame_sequence_number(0),
page_scale_factor(0.0),
......@@ -699,6 +708,7 @@ void ExplodedFrameState::assign(const ExplodedFrameState& other) {
target = other.target;
state_object = other.state_object;
document_state = other.document_state;
scroll_restoration_type = other.scroll_restoration_type;
pinch_viewport_scroll_offset = other.pinch_viewport_scroll_offset;
scroll_offset = other.scroll_offset;
item_sequence_number = other.item_sequence_number;
......
......@@ -10,6 +10,7 @@
#include "base/strings/nullable_string16.h"
#include "content/common/content_export.h"
#include "third_party/WebKit/public/platform/WebHTTPBody.h"
#include "third_party/WebKit/public/platform/WebHistoryScrollRestorationType.h"
#include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/point_f.h"
......@@ -48,6 +49,7 @@ struct CONTENT_EXPORT ExplodedFrameState {
base::NullableString16 target;
base::NullableString16 state_object;
std::vector<base::NullableString16> document_state;
blink::WebHistoryScrollRestorationType scroll_restoration_type;
gfx::PointF pinch_viewport_scroll_offset;
gfx::Point scroll_offset;
int64 item_sequence_number;
......
......@@ -70,6 +70,7 @@ void ExpectEquality(const ExplodedFrameState& a, const ExplodedFrameState& b) {
EXPECT_EQ(a.target, b.target);
EXPECT_EQ(a.state_object, b.state_object);
ExpectEquality(a.document_state, b.document_state);
EXPECT_EQ(a.scroll_restoration_type, b.scroll_restoration_type);
EXPECT_EQ(a.pinch_viewport_scroll_offset, b.pinch_viewport_scroll_offset);
EXPECT_EQ(a.scroll_offset, b.scroll_offset);
EXPECT_EQ(a.item_sequence_number, b.item_sequence_number);
......@@ -99,6 +100,8 @@ class PageStateSerializationTest : public testing::Test {
frame_state->document_state.push_back(NS16("q"));
frame_state->document_state.push_back(NS16("text"));
frame_state->document_state.push_back(NS16("dev.chromium.org"));
frame_state->scroll_restoration_type =
blink::WebHistoryScrollRestorationManual;
frame_state->pinch_viewport_scroll_offset = gfx::PointF(10, 15);
frame_state->scroll_offset = gfx::Point(0, 100);
frame_state->item_sequence_number = 1;
......@@ -138,6 +141,8 @@ class PageStateSerializationTest : public testing::Test {
frame_state->referrer_policy = blink::WebReferrerPolicyDefault;
if (!is_child)
frame_state->target = NS16("target");
frame_state->scroll_restoration_type =
blink::WebHistoryScrollRestorationAuto;
frame_state->pinch_viewport_scroll_offset = gfx::PointF(-1, -1);
frame_state->scroll_offset = gfx::Point(42, -42);
frame_state->item_sequence_number = 123;
......@@ -428,5 +433,9 @@ TEST_F(PageStateSerializationTest, BackwardsCompat_v20) {
TestBackwardsCompat(20);
}
TEST_F(PageStateSerializationTest, BackwardsCompat_v21) {
TestBackwardsCompat(21);
}
} // namespace
} // namespace content
......@@ -89,6 +89,7 @@ void GenerateFrameStateFromItem(const WebHistoryItem& item,
state->target = item.target();
if (!item.stateObject().isNull())
state->state_object = item.stateObject().toString();
state->scroll_restoration_type = item.scrollRestorationType();
state->pinch_viewport_scroll_offset = item.pinchViewportScrollOffset();
state->scroll_offset = item.scrollOffset();
state->item_sequence_number = item.itemSequenceNumber();
......@@ -142,6 +143,7 @@ void RecursivelyGenerateHistoryItem(const ExplodedFrameState& state,
WebSerializedScriptValue::fromString(state.state_object));
}
item.setDocumentState(state.document_state);
item.setScrollRestorationType(state.scroll_restoration_type);
item.setPinchViewportScrollOffset(state.pinch_viewport_scroll_offset);
item.setScrollOffset(state.scroll_offset);
item.setPageScaleFactor(state.page_scale_factor);
......
tAMAABUAAAABAAAAEAAAAGYAaQBsAGUALgB0AHgAdAAoAAAAaAB0AHQAcAA6AC8ALwBjAGgAcgBv
AG0AaQB1AG0ALgBvAHIAZwAvAAwAAAB0AGEAcgBnAGUAdAAqAAAA1v///yQAAABoAHQAdABwADoA
LwAvAGcAbwBvAGcAbABlAC4AYwBvAG0ALwAIAAAAYAAAAAoADQA/ACUAIABXAGUAYgBLAGkAdAAg
AHMAZQByAGkAYQBsAGkAegBlAGQAIABmAG8AcgBtACAAcwB0AGEAdABlACAAdgBlAHIAcwBpAG8A
bgAgADgAIAAKAA0APQAmABAAAABmAG8AcgBtACAAawBlAHkAAgAAADEAAAAGAAAAZgBvAG8AAAAI
AAAAZgBpAGwAZQACAAAAMgAAABAAAABmAGkAbABlAC4AdAB4AHQAFgAAAGQAaQBzAHAAbABhAHkA
TgBhAG0AZQAAAAgAAAAAAAAAAAAAQHsAAAAAAAAAyAEAAAAAAAAVAwAAAAAAAAEAAAAIAAAAAAAA
AAAA8L8IAAAAAAAAAAAA8L8AAAAAAQAAAAMAAAAAAAAAEAAAAGZpcnN0IGRhdGEgYmxvY2sBAAAA
EAAAAGYAaQBsAGUALgB0AHgAdAAAAAAAAAAAAP//////////CAAAAAAAAAAAAPh/AAAAAA8AAABk
YXRhIHRoZSBzZWNvbmQAFQMAAAAAAAAAAAAADgAAAGYAbwBvAC8AYgBhAHIAAAABAAAAKAAAAGgA
dAB0AHAAOgAvAC8AYwBoAHIAbwBtAGkAdQBtAC4AbwByAGcALwD/////KgAAANb///8kAAAAaAB0
AHQAcAA6AC8ALwBnAG8AbwBnAGwAZQAuAGMAbwBtAC8ACAAAAGAAAAAKAA0APwAlACAAVwBlAGIA
SwBpAHQAIABzAGUAcgBpAGEAbABpAHoAZQBkACAAZgBvAHIAbQAgAHMAdABhAHQAZQAgAHYAZQBy
AHMAaQBvAG4AIAA4ACAACgANAD0AJgAQAAAAZgBvAHIAbQAgAGsAZQB5AAIAAAAxAAAABgAAAGYA
bwBvAAAACAAAAGYAaQBsAGUAAgAAADIAAAAQAAAAZgBpAGwAZQAuAHQAeAB0ABYAAABkAGkAcwBw
AGwAYQB5AE4AYQBtAGUAAAAIAAAAAAAAAAAAAEB7AAAAAAAAAMgBAAAAAAAAFQMAAAAAAAABAAAA
CAAAAAAAAAAAAPC/CAAAAAAAAAAAAPC/AAAAAAAAAAD/////AAAAAA==
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment