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