190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/page_state.h" 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/files/file_path.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/page_state_serialization.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace content { 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::NullableString16 ToNullableString16(const std::string& utf8) { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::NullableString16(base::UTF8ToUTF16(utf8), false); 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::FilePath ToFilePath(const base::NullableString16& s) { 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::FilePath::FromUTF16Unsafe(s.string()); 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ToFilePathVector(const std::vector<base::NullableString16>& input, 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<base::FilePath>* output) { 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch output->clear(); 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch output->reserve(input.size()); 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < input.size(); ++i) 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch output->push_back(ToFilePath(input[i])); 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPageState ToPageState(const ExplodedPageState& state) { 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string encoded_data; 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!EncodePageState(state, &encoded_data)) 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PageState(); 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PageState::CreateFromEncodedData(encoded_data); 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RecursivelyRemovePasswordData(ExplodedFrameState* state) { 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (state->http_body.contains_passwords) 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->http_body = ExplodedHttpBody(); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RecursivelyRemoveScrollOffset(ExplodedFrameState* state) { 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->scroll_offset = gfx::Point(); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state->pinch_viewport_scroll_offset = gfx::PointF(); 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RecursivelyRemoveReferrer(ExplodedFrameState* state) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) state->referrer = base::NullableString16(); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) state->referrer_policy = blink::WebReferrerPolicyDefault; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<ExplodedFrameState>::iterator it = state->children.begin(); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != state->children.end(); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecursivelyRemoveReferrer(&*it); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)PageState PageState::CreateFromEncodedData(const std::string& data) { 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return PageState(data); 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPageState PageState::CreateFromURL(const GURL& url) { 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedPageState state; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state.top.url_string = ToNullableString16(url.possibly_invalid_spec()); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ToPageState(state); 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPageState PageState::CreateForTesting( 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& url, 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool body_contains_password_data, 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* optional_body_data, 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath* optional_body_file_path) { 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedPageState state; 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state.top.url_string = ToNullableString16(url.possibly_invalid_spec()); 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (optional_body_data || optional_body_file_path) { 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state.top.http_body.is_null = false; 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (optional_body_data) { 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedHttpBodyElement element; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) element.type = blink::WebHTTPBody::Element::TypeData; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.data = optional_body_data; 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state.top.http_body.elements.push_back(element); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (optional_body_file_path) { 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedHttpBodyElement element; 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) element.type = blink::WebHTTPBody::Element::TypeFile; 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch element.file_path = 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ToNullableString16(optional_body_file_path->AsUTF8Unsafe()); 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state.top.http_body.elements.push_back(element); 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state.referenced_files.push_back(element.file_path); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state.top.http_body.contains_passwords = 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch body_contains_password_data; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ToPageState(state); 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)PageState::PageState() { 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool PageState::IsValid() const { 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return !data_.empty(); 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool PageState::Equals(const PageState& other) const { 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return data_ == other.data_; 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const std::string& PageState::ToEncodedData() const { 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return data_; 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::vector<base::FilePath> PageState::GetReferencedFiles() const { 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<base::FilePath> results; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedPageState state; 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (DecodePageState(data_, &state)) 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ToFilePathVector(state.referenced_files, &results); 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return results; 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPageState PageState::RemovePasswordData() const { 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedPageState state; 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!DecodePageState(data_, &state)) 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PageState(); // Oops! 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RecursivelyRemovePasswordData(&state.top); 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ToPageState(state); 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPageState PageState::RemoveScrollOffset() const { 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ExplodedPageState state; 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!DecodePageState(data_, &state)) 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PageState(); // Oops! 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RecursivelyRemoveScrollOffset(&state.top); 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ToPageState(state); 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PageState PageState::RemoveReferrer() const { 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (data_.empty()) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return *this; 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExplodedPageState state; 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!DecodePageState(data_, &state)) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PageState(); // Oops! 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecursivelyRemoveReferrer(&state.top); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ToPageState(state); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)PageState::PageState(const std::string& data) 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : data_(data) { 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(darin): Enable this DCHECK once tests have been fixed up to not pass 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // bogus encoded data to CreateFromEncodedData. 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) //DCHECK(IsValid()); 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace content 173