Index: content/public/common/page_state.cc |
diff --git a/content/public/common/page_state.cc b/content/public/common/page_state.cc |
index 7daaaac6546e046ac83bbd7968413e0bbba4b6ae..54c00e3dc01849a98bd36598aabc046dee86fd2c 100644 |
--- a/content/public/common/page_state.cc |
+++ b/content/public/common/page_state.cc |
@@ -4,13 +4,97 @@ |
#include "content/public/common/page_state.h" |
+#include "base/files/file_path.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "content/common/page_state_serialization.h" |
+ |
namespace content { |
+namespace { |
+ |
+base::NullableString16 ToNullableString16(const std::string& utf8) { |
+ return base::NullableString16(UTF8ToUTF16(utf8), false); |
+} |
+ |
+base::FilePath ToFilePath(const base::NullableString16& s) { |
+ return base::FilePath::FromUTF16Unsafe(s.string()); |
+} |
+ |
+void ToFilePathVector(const std::vector<base::NullableString16>& input, |
+ std::vector<base::FilePath>* output) { |
+ output->clear(); |
+ output->reserve(input.size()); |
+ for (size_t i = 0; i < input.size(); ++i) |
+ output->push_back(ToFilePath(input[i])); |
+} |
+ |
+PageState ToPageState(const ExplodedPageState& state) { |
+ std::string encoded_data; |
+ if (!EncodePageState(state, &encoded_data)) |
+ return PageState(); |
+ |
+ return PageState::CreateFromEncodedData(encoded_data); |
+} |
+ |
+void RecursivelyRemovePasswordData(ExplodedFrameState* state) { |
+ if (state->http_body.contains_passwords) |
+ state->http_body = ExplodedHttpBody(); |
+} |
+ |
+void RecursivelyRemoveScrollOffset(ExplodedFrameState* state) { |
+ state->scroll_offset = gfx::Point(); |
+} |
+ |
+} // namespace |
// static |
PageState PageState::CreateFromEncodedData(const std::string& data) { |
return PageState(data); |
} |
+// static |
+PageState PageState::CreateFromURL(const GURL& url) { |
+ ExplodedPageState state; |
+ |
+ state.top.url_string = state.top.original_url_string = |
+ ToNullableString16(url.possibly_invalid_spec()); |
+ |
+ return ToPageState(state); |
+} |
+ |
+// static |
+PageState PageState::CreateForTesting( |
+ const GURL& url, |
+ bool body_contains_password_data, |
+ const char* optional_body_data, |
+ const base::FilePath* optional_body_file_path) { |
+ ExplodedPageState state; |
+ |
+ state.top.url_string = state.top.original_url_string = |
+ ToNullableString16(url.possibly_invalid_spec()); |
+ |
+ if (optional_body_data || optional_body_file_path) { |
+ state.top.http_body.is_null = false; |
+ if (optional_body_data) { |
+ ExplodedHttpBodyElement element; |
+ element.type = WebKit::WebHTTPBody::Element::TypeData; |
+ element.data = optional_body_data; |
+ state.top.http_body.elements.push_back(element); |
+ } |
+ if (optional_body_file_path) { |
+ ExplodedHttpBodyElement element; |
+ element.type = WebKit::WebHTTPBody::Element::TypeFile; |
+ element.file_path = |
+ ToNullableString16(optional_body_file_path->AsUTF8Unsafe()); |
+ state.top.http_body.elements.push_back(element); |
+ state.referenced_files.push_back(element.file_path); |
+ } |
+ state.top.http_body.contains_passwords = |
+ body_contains_password_data; |
+ } |
+ |
+ return ToPageState(state); |
+} |
+ |
PageState::PageState() { |
} |
@@ -26,6 +110,36 @@ const std::string& PageState::ToEncodedData() const { |
return data_; |
} |
+std::vector<base::FilePath> PageState::GetReferencedFiles() const { |
+ std::vector<base::FilePath> results; |
+ |
+ ExplodedPageState state; |
+ if (DecodePageState(data_, &state)) |
+ ToFilePathVector(state.referenced_files, &results); |
+ |
+ return results; |
+} |
+ |
+PageState PageState::RemovePasswordData() const { |
+ ExplodedPageState state; |
+ if (!DecodePageState(data_, &state)) |
+ return PageState(); // Oops! |
+ |
+ RecursivelyRemovePasswordData(&state.top); |
+ |
+ return ToPageState(state); |
+} |
+ |
+PageState PageState::RemoveScrollOffset() const { |
+ ExplodedPageState state; |
+ if (!DecodePageState(data_, &state)) |
+ return PageState(); // Oops! |
+ |
+ RecursivelyRemoveScrollOffset(&state.top); |
+ |
+ return ToPageState(state); |
+} |
+ |
PageState::PageState(const std::string& data) |
: data_(data) { |
// TODO(darin): Enable this DCHECK once tests have been fixed up to not pass |