Chromium Code Reviews| Index: webkit/glue/glue_serialize.cc |
| diff --git a/webkit/glue/glue_serialize.cc b/webkit/glue/glue_serialize.cc |
| index 4ee3bec89b80a25b51fb43dacf50eb225a2fad03..f2a316b63a782a1c5df135efed6a4d513a84da8b 100644 |
| --- a/webkit/glue/glue_serialize.cc |
| +++ b/webkit/glue/glue_serialize.cc |
| @@ -7,6 +7,7 @@ |
| #include <string> |
| #include "base/pickle.h" |
| +#include "base/string_number_conversions.h" |
| #include "base/utf_string_conversions.h" |
| #include "googleurl/src/gurl.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebData.h" |
| @@ -560,6 +561,56 @@ std::vector<FilePath> FilePathsFromHistoryState( |
| return to_return; |
| } |
| +std::vector<FilePath> FilePathsFromInputsInHistoryState( |
| + const std::string& content_state) { |
| + std::vector<FilePath> to_return; |
| + // TODO(darin): We should avoid using the WebKit API here, so that we do not |
| + // need to have WebKit initialized before calling this method. |
| + const WebHistoryItem& item = |
| + HistoryItemFromString(content_state, ALWAYS_INCLUDE_FORM_DATA, true); |
| + if (item.isNull()) { |
| + // Couldn't parse the string. |
| + return to_return; |
| + } |
| + const WebVector<WebString>& document_state = item.documentState(); |
| + if (document_state.isEmpty()) |
| + return to_return; |
| + // The first entry contains the version number of the document state. Check |
| + // the version here, otherwise this might result in granting file permissions |
| + // to wrong files. |
| + if (std::string(document_state[0].utf8()).find( |
| + "WebKit serialized form state version 5") == std::string::npos) |
| + return to_return; |
| + |
| + // For each document element, the vector contains the following entries: |
|
brettw
2012/07/11 00:02:42
WE don't want to do this type of manual parsing wh
marja
2012/08/22 09:04:28
Done.
|
| + // - name |
| + // - form control type |
| + // - form key |
| + // - number of additional fields |
| + // - additional field 1 |
| + // - ... |
| + // - additional field n |
| + size_t i = 1; // Skip the first entry. |
| + while (i + 3 < document_state.size()) { |
| + int fields; |
| + if (!base::StringToInt(std::string(document_state[i + 3].utf8()), &fields)) |
| + break; |
| + if (i + 3 + fields >= document_state.size()) |
| + break; |
| + if (document_state[i + 1] == "file") { |
| + for (size_t j = i + 4; j < i + 4 + fields; j += 2) { |
| + // For file inputs, the additional fields are: |
| + // - file path |
| + // - file name |
| + to_return.push_back(WebStringToFilePath(document_state[j])); |
| + } |
| + } |
| + // Jump to the next entry. |
| + i += (4 + fields); |
| + } |
| + return to_return; |
| +} |
| + |
| // For testing purposes only. |
| void HistoryItemToVersionedString(const WebHistoryItem& item, int version, |
| std::string* serialized_item) { |