1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <math.h>
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/base64.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/path_service.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/pickle.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_util.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/page_state_serialization.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/content_paths.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN)
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochinline bool isnan(double num) { return !!_isnan(num); }
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::NullableString16 NS16(const char* s) {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return s ? base::NullableString16(base::ASCIIToUTF16(s), false) :
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             base::NullableString16();
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//-----------------------------------------------------------------------------
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <typename T>
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ExpectEquality(const T& a, const T& b) {
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a, b);
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <typename T>
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ExpectEquality(const std::vector<T>& a, const std::vector<T>& b) {
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.size(), b.size());
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < std::min(a.size(), b.size()); ++i)
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectEquality(a[i], b[i]);
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <>
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ExpectEquality(const ExplodedHttpBodyElement& a,
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    const ExplodedHttpBodyElement& b) {
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.type, b.type);
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.data, b.data);
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.file_path, b.file_path);
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(a.filesystem_url, b.filesystem_url);
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.file_start, b.file_start);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.file_length, b.file_length);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!(isnan(a.file_modification_time) && isnan(b.file_modification_time)))
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_DOUBLE_EQ(a.file_modification_time, b.file_modification_time);
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(a.blob_uuid, b.blob_uuid);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <>
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ExpectEquality(const ExplodedHttpBody& a, const ExplodedHttpBody& b) {
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.http_content_type, b.http_content_type);
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.identifier, b.identifier);
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.contains_passwords, b.contains_passwords);
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.is_null, b.is_null);
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(a.elements, b.elements);
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <>
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ExpectEquality(const ExplodedFrameState& a, const ExplodedFrameState& b) {
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.url_string, b.url_string);
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.referrer, b.referrer);
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(a.referrer_policy, b.referrer_policy);
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.target, b.target);
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.state_object, b.state_object);
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(a.document_state, b.document_state);
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(a.pinch_viewport_scroll_offset, b.pinch_viewport_scroll_offset);
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.scroll_offset, b.scroll_offset);
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.item_sequence_number, b.item_sequence_number);
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.document_sequence_number, b.document_sequence_number);
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(a.page_scale_factor, b.page_scale_factor);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(a.http_body, b.http_body);
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(a.children, b.children);
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ExpectEquality(const ExplodedPageState& a, const ExplodedPageState& b) {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(a.referenced_files, b.referenced_files);
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(a.top, b.top);
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//-----------------------------------------------------------------------------
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass PageStateSerializationTest : public testing::Test {
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void PopulateFrameState(ExplodedFrameState* frame_state) {
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Invent some data for the various fields.
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->url_string = NS16("http://dev.chromium.org/");
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->referrer = NS16("https://www.google.com/search?q=dev.chromium.org");
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame_state->referrer_policy = blink::WebReferrerPolicyAlways;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->target = NS16("foo");
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->state_object = NS16(NULL);
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("1"));
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("q"));
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("text"));
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("dev.chromium.org"));
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    frame_state->pinch_viewport_scroll_offset = gfx::PointF(10, 15);
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->scroll_offset = gfx::Point(0, 100);
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->item_sequence_number = 1;
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_sequence_number = 2;
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    frame_state->frame_sequence_number = 3;
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->page_scale_factor = 2.0;
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void PopulateHttpBody(ExplodedHttpBody* http_body,
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        std::vector<base::NullableString16>* referenced_files) {
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    http_body->is_null = false;
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    http_body->identifier = 12345;
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    http_body->contains_passwords = false;
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    http_body->http_content_type = NS16("text/foo");
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExplodedHttpBodyElement e1;
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    e1.type = blink::WebHTTPBody::Element::TypeData;
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    e1.data = "foo";
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    http_body->elements.push_back(e1);
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExplodedHttpBodyElement e2;
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    e2.type = blink::WebHTTPBody::Element::TypeFile;
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    e2.file_path = NS16("file.txt");
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    e2.file_start = 100;
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    e2.file_length = 1024;
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    e2.file_modification_time = 9999.0;
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    http_body->elements.push_back(e2);
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    referenced_files->push_back(e2.file_path);
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void PopulateFrameStateForBackwardsCompatTest(
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExplodedFrameState* frame_state,
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool is_child) {
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->url_string = NS16("http://chromium.org/");
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->referrer = NS16("http://google.com/");
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frame_state->referrer_policy = blink::WebReferrerPolicyDefault;
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!is_child)
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->target = NS16("target");
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    frame_state->pinch_viewport_scroll_offset = gfx::PointF(-1, -1);
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->scroll_offset = gfx::Point(42, -42);
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->item_sequence_number = 123;
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_sequence_number = 456;
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    frame_state->frame_sequence_number = 789;
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->page_scale_factor = 2.0f;
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        NS16("\n\r?% WebKit serialized form state version 8 \n\r=&"));
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("form key"));
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("1"));
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("foo"));
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("file"));
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("2"));
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("file.txt"));
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_state->document_state.push_back(NS16("displayName"));
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!is_child) {
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->http_body.http_content_type = NS16("foo/bar");
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->http_body.identifier = 789;
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->http_body.is_null = false;
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExplodedHttpBodyElement e1;
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      e1.type = blink::WebHTTPBody::Element::TypeData;
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      e1.data = "first data block";
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->http_body.elements.push_back(e1);
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExplodedHttpBodyElement e2;
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      e2.type = blink::WebHTTPBody::Element::TypeFile;
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      e2.file_path = NS16("file.txt");
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->http_body.elements.push_back(e2);
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExplodedHttpBodyElement e3;
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      e3.type = blink::WebHTTPBody::Element::TypeData;
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      e3.data = "data the second";
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->http_body.elements.push_back(e3);
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ExplodedFrameState child_state;
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PopulateFrameStateForBackwardsCompatTest(&child_state, true);
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_state->children.push_back(child_state);
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void PopulatePageStateForBackwardsCompatTest(ExplodedPageState* page_state) {
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    page_state->referenced_files.push_back(NS16("file.txt"));
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PopulateFrameStateForBackwardsCompatTest(&page_state->top, false);
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void TestBackwardsCompat(int version) {
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char* suffix = "";
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Unfortunately, the format of version 11 is different on Android, so we
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // need to use a special reference file.
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (version == 11)
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      suffix = "_android";
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::FilePath path;
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PathService::Get(content::DIR_TEST_DATA, &path);
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.AppendASCII("page_state").AppendASCII(
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::StringPrintf("serialized_v%d%s.dat", version, suffix));
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string file_contents;
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!base::ReadFileToString(path, &file_contents)) {
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ADD_FAILURE() << "File not found: " << path.value();
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string trimmed_contents;
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::RemoveChars(file_contents, "\r\n", &trimmed_contents));
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string encoded;
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(base::Base64Decode(trimmed_contents, &encoded));
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExplodedPageState output;
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Because version 11 of the file format unfortunately bakes in the device
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // scale factor on Android, perform this test by assuming a preset device
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // scale factor, ignoring the device scale factor of the current device.
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const float kPresetDeviceScaleFactor = 2.0f;
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(DecodePageStateWithDeviceScaleFactorForTesting(
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        encoded,
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        kPresetDeviceScaleFactor,
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        &output));
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(DecodePageState(encoded, &output));
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExplodedPageState expected;
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PopulatePageStateForBackwardsCompatTest(&expected);
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExpectEquality(expected, output);
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BasicEmpty) {
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState input;
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string encoded;
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(EncodePageState(input, &encoded));
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState output;
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(DecodePageState(encoded, &output));
247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(input, output);
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BasicFrame) {
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState input;
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PopulateFrameState(&input.top);
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string encoded;
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(EncodePageState(input, &encoded));
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState output;
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(DecodePageState(encoded, &output));
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(input, output);
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BasicFramePOST) {
265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState input;
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PopulateFrameState(&input.top);
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PopulateHttpBody(&input.top.http_body, &input.referenced_files);
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string encoded;
270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(EncodePageState(input, &encoded));
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState output;
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(DecodePageState(encoded, &output));
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(input, output);
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BasicFrameSet) {
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState input;
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PopulateFrameState(&input.top);
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Add some child frames.
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (int i = 0; i < 4; ++i) {
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExplodedFrameState child_state;
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PopulateFrameState(&child_state);
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    input.top.children.push_back(child_state);
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string encoded;
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(EncodePageState(input, &encoded));
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState output;
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(DecodePageState(encoded, &output));
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(input, output);
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BasicFrameSetPOST) {
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState input;
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PopulateFrameState(&input.top);
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Add some child frames.
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (int i = 0; i < 4; ++i) {
304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ExplodedFrameState child_state;
305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PopulateFrameState(&child_state);
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Simulate a form POST on a subframe.
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (i == 2)
309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PopulateHttpBody(&child_state.http_body, &input.referenced_files);
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    input.top.children.push_back(child_state);
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string encoded;
315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EncodePageState(input, &encoded);
316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState output;
318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DecodePageState(encoded, &output);
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectEquality(input, output);
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BadMessagesTest1) {
324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Pickle p;
325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Version 14
326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(14);
327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Empty strings.
328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (int i = 0; i < 6; ++i)
329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    p.WriteInt(-1);
330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Bad real number.
331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(-1);
332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string s(static_cast<const char*>(p.data()), p.size());
334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState output;
336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(DecodePageState(s, &output));
337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BadMessagesTest2) {
340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  double d = 0;
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Pickle p;
342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Version 14
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(14);
344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Empty strings.
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (int i = 0; i < 6; ++i)
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    p.WriteInt(-1);
347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // More misc fields.
348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteData(reinterpret_cast<const char*>(&d), sizeof(d));
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(1);
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(1);
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(0);
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(0);
353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(-1);
354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(0);
355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // WebForm
356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  p.WriteInt(1);
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  p.WriteInt(blink::WebHTTPBody::Element::TypeData);
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string s(static_cast<const char*>(p.data()), p.size());
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState output;
362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(DecodePageState(s, &output));
363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, DumpExpectedPageStateForBackwardsCompat) {
36623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Change to #if 1 to enable this code.  Use this code to generate data, based
36723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // on the current serialization format, for the BackwardsCompat_vXX tests.
36823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if 0
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExplodedPageState state;
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PopulatePageStateForBackwardsCompatTest(&state);
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string encoded;
373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(EncodePageState(state, &encoded));
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string base64;
376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(encoded, &base64);
377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::FilePath path;
379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PathService::Get(base::DIR_TEMP, &path);
380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  path = path.AppendASCII("expected.dat");
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FILE* fp = base::OpenFile(path, "wb");
383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(fp);
384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const size_t kRowSize = 76;
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t offset = 0; offset < base64.size(); offset += kRowSize) {
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    size_t length = std::min(base64.size() - offset, kRowSize);
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string segment(&base64[offset], length);
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    segment.push_back('\n');
390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_EQ(1U, fwrite(segment.data(), segment.size(), 1, fp));
391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fclose(fp);
39423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !defined(OS_ANDROID)
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// TODO(darin): Re-enable for Android once this test accounts for systems with
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//              a device scale factor not equal to 2.
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BackwardsCompat_v11) {
401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestBackwardsCompat(11);
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BackwardsCompat_v12) {
406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestBackwardsCompat(12);
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BackwardsCompat_v13) {
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestBackwardsCompat(13);
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(PageStateSerializationTest, BackwardsCompat_v14) {
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestBackwardsCompat(14);
415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(PageStateSerializationTest, BackwardsCompat_v15) {
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestBackwardsCompat(15);
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST_F(PageStateSerializationTest, BackwardsCompat_v16) {
4220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  TestBackwardsCompat(16);
4230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
4240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(PageStateSerializationTest, BackwardsCompat_v18) {
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestBackwardsCompat(18);
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(PageStateSerializationTest, BackwardsCompat_v20) {
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestBackwardsCompat(20);
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
435