Index: content/browser/indexed_db/indexed_db_data_format_version.h |
diff --git a/content/browser/indexed_db/indexed_db_data_format_version.h b/content/browser/indexed_db/indexed_db_data_format_version.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5c7e0f1ec9a1eea28173183e577b8d609a7a0f5c |
--- /dev/null |
+++ b/content/browser/indexed_db/indexed_db_data_format_version.h |
@@ -0,0 +1,72 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATA_FORMAT_VERSION_H_ |
+#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATA_FORMAT_VERSION_H_ |
+ |
+#include <cstdint> |
+#include <limits> |
+ |
+#include "base/logging.h" |
+#include "content/common/content_export.h" |
+ |
+namespace content { |
+ |
+// Contains version data for the wire format used for encoding IndexedDB values. |
+// A version tuple (a, b) is at least as new as (a', b') |
+// iff a >= a' and b >= b'. |
+class IndexedDBDataFormatVersion { |
+ public: |
+ constexpr IndexedDBDataFormatVersion() {} |
+ constexpr IndexedDBDataFormatVersion(uint32_t v8_version, |
+ uint32_t blink_version) |
+ : v8_version_(v8_version), blink_version_(blink_version) {} |
+ |
+ static IndexedDBDataFormatVersion GetCurrent() { return current_; } |
+ static IndexedDBDataFormatVersion& GetMutableCurrentForTesting() { |
+ return current_; |
+ } |
+ |
+ uint32_t v8_version() const { return v8_version_; } |
+ uint32_t blink_version() const { return blink_version_; } |
+ |
+ bool operator==(const IndexedDBDataFormatVersion& other) const { |
+ return v8_version_ == other.v8_version_ && |
+ blink_version_ == other.blink_version_; |
+ } |
+ bool operator!=(const IndexedDBDataFormatVersion& other) const { |
+ return !operator==(other); |
+ } |
+ |
+ bool IsAtLeast(const IndexedDBDataFormatVersion& other) const { |
+ return v8_version_ >= other.v8_version_ && |
+ blink_version_ >= other.blink_version_; |
+ } |
+ |
+ // Encodes and decodes the tuple from an int64_t. |
+ // Since negative values are considered invalid, this scheme will only work |
+ // the v8 version would overflow int32_t. We check both, to be consistent. |
+ // |
+ // This scheme is chosen so that earlier versions (before we reported both the |
+ // Blink and V8 versions) decode properly, with a V8 version of 0. |
+ int64_t Encode() const { |
+ DCHECK_GE(static_cast<int32_t>(v8_version_), 0); |
+ DCHECK_GE(static_cast<int32_t>(blink_version_), 0); |
+ return (static_cast<int64_t>(v8_version_) << 32) | blink_version_; |
+ } |
+ static IndexedDBDataFormatVersion Decode(int64_t encoded) { |
+ DCHECK_GE(encoded, 0); |
+ return IndexedDBDataFormatVersion(encoded >> 32, encoded); |
+ } |
+ |
+ private: |
+ uint32_t v8_version_ = 0; |
+ uint32_t blink_version_ = 0; |
+ |
+ CONTENT_EXPORT static IndexedDBDataFormatVersion current_; |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATA_FORMAT_VERSION_H_ |