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