Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(648)

Unified Diff: android_webview/native/state_serializer.cc

Issue 1687853002: Make AW state_serializer handle restoring also legacy format (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix signed/unsigned int mismatch Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « android_webview/native/state_serializer.h ('k') | android_webview/native/state_serializer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/native/state_serializer.cc
diff --git a/android_webview/native/state_serializer.cc b/android_webview/native/state_serializer.cc
index 65eceb3fcde1fa63e71e124fc0064fb05790357f..398b17e60d6f55cbab077d180f0fcabccde206f3 100644
--- a/android_webview/native/state_serializer.cc
+++ b/android_webview/native/state_serializer.cc
@@ -31,10 +31,7 @@ namespace android_webview {
namespace {
-// Sanity check value that we are restoring from a valid pickle.
-// This can potentially used as an actual serialization version number in the
-// future if we ever decide to support restoring from older versions.
-const uint32_t AW_STATE_VERSION = 20151204;
+const uint32_t AW_STATE_VERSION = internal::AW_STATE_VERSION_DATA_URL;
} // namespace
@@ -65,7 +62,10 @@ bool WriteToPickle(const content::WebContents& web_contents,
return false;
}
- // Please update AW_STATE_VERSION if serialization format is changed.
+ // Please update AW_STATE_VERSION and IsSupportedVersion() if serialization
+ // format is changed.
+ // Make sure the serialization format is updated in a backwards compatible
+ // way.
return true;
}
@@ -75,7 +75,8 @@ bool RestoreFromPickle(base::PickleIterator* iterator,
DCHECK(iterator);
DCHECK(web_contents);
- if (!internal::RestoreHeaderFromPickle(iterator))
+ uint32_t state_version = internal::RestoreHeaderFromPickle(iterator);
+ if (!state_version)
return false;
int entry_count = -1;
@@ -98,7 +99,8 @@ bool RestoreFromPickle(base::PickleIterator* iterator,
entries.reserve(entry_count);
for (int i = 0; i < entry_count; ++i) {
entries.push_back(content::NavigationEntry::Create());
- if (!internal::RestoreNavigationEntryFromPickle(iterator, entries[i].get()))
+ if (!internal::RestoreNavigationEntryFromPickle(state_version, iterator,
+ entries[i].get()))
return false;
entries[i]->SetPageID(i);
@@ -136,22 +138,39 @@ bool RestoreFromPickle(base::PickleIterator* iterator,
namespace internal {
bool WriteHeaderToPickle(base::Pickle* pickle) {
- return pickle->WriteUInt32(AW_STATE_VERSION);
+ return WriteHeaderToPickle(AW_STATE_VERSION, pickle);
}
-bool RestoreHeaderFromPickle(base::PickleIterator* iterator) {
+bool WriteHeaderToPickle(uint32_t state_version, base::Pickle* pickle) {
+ return pickle->WriteUInt32(state_version);
+}
+
+uint32_t RestoreHeaderFromPickle(base::PickleIterator* iterator) {
uint32_t state_version = -1;
if (!iterator->ReadUInt32(&state_version))
- return false;
+ return 0;
- if (AW_STATE_VERSION != state_version)
- return false;
+ if (IsSupportedVersion(state_version)) {
+ return state_version;
+ }
- return true;
+ return 0;
+}
+
+bool IsSupportedVersion(uint32_t state_version) {
+ return state_version == internal::AW_STATE_VERSION_INITIAL ||
+ state_version == internal::AW_STATE_VERSION_DATA_URL;
}
bool WriteNavigationEntryToPickle(const content::NavigationEntry& entry,
base::Pickle* pickle) {
+ return WriteNavigationEntryToPickle(AW_STATE_VERSION, entry, pickle);
+}
+
+bool WriteNavigationEntryToPickle(uint32_t state_version,
+ const content::NavigationEntry& entry,
+ base::Pickle* pickle) {
+ DCHECK(IsSupportedVersion(state_version));
if (!pickle->WriteString(entry.GetURL().spec()))
return false;
@@ -179,7 +198,7 @@ bool WriteNavigationEntryToPickle(const content::NavigationEntry& entry,
if (!pickle->WriteString(entry.GetBaseURLForDataURL().spec()))
return false;
- {
+ if (state_version >= internal::AW_STATE_VERSION_DATA_URL) {
const char* data = nullptr;
size_t size = 0;
scoped_refptr<const base::RefCountedString> s = entry.GetDataURLAsString();
@@ -202,13 +221,23 @@ bool WriteNavigationEntryToPickle(const content::NavigationEntry& entry,
if (!pickle->WriteInt(entry.GetHttpStatusCode()))
return false;
- // Please update AW_STATE_VERSION if serialization format is changed.
+ // Please update AW_STATE_VERSION and IsSupportedVersion() if serialization
+ // format is changed.
+ // Make sure the serialization format is updated in a backwards compatible
+ // way.
return true;
}
bool RestoreNavigationEntryFromPickle(base::PickleIterator* iterator,
content::NavigationEntry* entry) {
+ return RestoreNavigationEntryFromPickle(AW_STATE_VERSION, iterator, entry);
+}
+
+bool RestoreNavigationEntryFromPickle(uint32_t state_version,
+ base::PickleIterator* iterator,
+ content::NavigationEntry* entry) {
+ DCHECK(IsSupportedVersion(state_version));
{
string url;
if (!iterator->ReadString(&url))
@@ -274,7 +303,7 @@ bool RestoreNavigationEntryFromPickle(base::PickleIterator* iterator,
entry->SetBaseURLForDataURL(GURL(base_url_for_data_url));
}
- {
+ if (state_version >= internal::AW_STATE_VERSION_DATA_URL) {
const char* data;
int size;
if (!iterator->ReadData(&data, &size))
« no previous file with comments | « android_webview/native/state_serializer.h ('k') | android_webview/native/state_serializer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698