| Index: content/browser/indexed_db/indexed_db_struct_traits.h
 | 
| diff --git a/content/browser/indexed_db/indexed_db_struct_traits.h b/content/browser/indexed_db/indexed_db_struct_traits.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..49cf4bc7a830dfc1b21436592f539ddb6e28a986
 | 
| --- /dev/null
 | 
| +++ b/content/browser/indexed_db/indexed_db_struct_traits.h
 | 
| @@ -0,0 +1,260 @@
 | 
| +// Copyright 2016 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_STRUCT_TRAITS_H_
 | 
| +#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_STRUCT_TRAITS_H_
 | 
| +
 | 
| +#include <string>
 | 
| +
 | 
| +#include "content/browser/indexed_db/indexed_db_data_loss_info.h"
 | 
| +#include "content/browser/indexed_db/indexed_db_metadata.h"
 | 
| +#include "mojo/common/common_type_converters.h"
 | 
| +// TODO(cmumford): This is wrong.
 | 
| +#include "third_party/WebKit/Source/modules/indexeddb/indexed_db.mojom.h"
 | 
| +#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBTypes.h"
 | 
| +
 | 
| +namespace mojo {
 | 
| +
 | 
| +template <>
 | 
| +struct EnumTraits<indexed_db::mojom::KeyPathType, blink::WebIDBKeyPathType> {
 | 
| +  static indexed_db::mojom::KeyPathType ToMojom(blink::WebIDBKeyPathType input);
 | 
| +  static bool FromMojom(indexed_db::mojom::KeyPathType input,
 | 
| +                        blink::WebIDBKeyPathType* output);
 | 
| +};
 | 
| +
 | 
| +template <>
 | 
| +struct EnumTraits<indexed_db::mojom::DataLoss, blink::WebIDBDataLoss> {
 | 
| +  static indexed_db::mojom::DataLoss ToMojom(blink::WebIDBDataLoss input);
 | 
| +  static bool FromMojom(indexed_db::mojom::DataLoss input,
 | 
| +                        blink::WebIDBDataLoss* output);
 | 
| +};
 | 
| +
 | 
| +template <>
 | 
| +struct StructTraits<indexed_db::mojom::DataLossInfo,
 | 
| +                    content::IndexedDBDataLossInfo> {
 | 
| +  static blink::WebIDBDataLoss status(const content::IndexedDBDataLossInfo& r) {
 | 
| +    return r.status;
 | 
| +  }
 | 
| +  static String message(const content::IndexedDBDataLossInfo& r) {
 | 
| +    return String::From(r.message);
 | 
| +  }
 | 
| +  static bool Read(indexed_db::mojom::DataLossInfoDataView data,
 | 
| +                   content::IndexedDBDataLossInfo* out) {
 | 
| +    if (!data.ReadStatus(&out->status))
 | 
| +      return false;
 | 
| +    if (!data.ReadMessage(&out->message))
 | 
| +      return false;
 | 
| +    return true;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +template <>
 | 
| +struct StructTraits<indexed_db::mojom::ErrorInfo,
 | 
| +                    content::IndexedDBDatabaseError> {
 | 
| +  static int16_t code(const content::IndexedDBDatabaseError& r) {
 | 
| +    return r.code();
 | 
| +  }
 | 
| +  static String message(const content::IndexedDBDatabaseError& r) {
 | 
| +    return String::From(r.message());
 | 
| +  }
 | 
| +  static bool Read(indexed_db::mojom::ErrorInfoDataView data,
 | 
| +                   content::IndexedDBDatabaseError* out) {
 | 
| +    mojo::String message;
 | 
| +    if (!data.ReadMessage(&message))
 | 
| +      return false;
 | 
| +
 | 
| +    *out = content::IndexedDBDatabaseError(data.code(),
 | 
| +                                           message.To<base::string16>());
 | 
| +
 | 
| +    return true;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +template <>
 | 
| +struct StructTraits<indexed_db::mojom::KeyPath, content::IndexedDBKeyPath> {
 | 
| +  static blink::WebIDBKeyPathType type(const content::IndexedDBKeyPath& r) {
 | 
| +    return r.type();
 | 
| +  }
 | 
| +  static indexed_db::mojom::KeyPathDataPtr data(
 | 
| +      const content::IndexedDBKeyPath& r) {
 | 
| +    indexed_db::mojom::KeyPathDataPtr data =
 | 
| +        indexed_db::mojom::KeyPathData::New();
 | 
| +    switch (r.type()) {
 | 
| +      case blink::WebIDBKeyPathTypeNull:
 | 
| +        break;
 | 
| +      case blink::WebIDBKeyPathTypeString:
 | 
| +        data->set_str(String::From(r.string()));
 | 
| +        break;
 | 
| +      case blink::WebIDBKeyPathTypeArray:
 | 
| +        NOTREACHED();
 | 
| +        // Maybe missing a type converter. Confirm with Yuzhu.
 | 
| +        // data->set_arr(Array<mojo::String>::From(r.array()));
 | 
| +        break;
 | 
| +    }
 | 
| +    return data;
 | 
| +  }
 | 
| +  static String string(const content::IndexedDBKeyPath& r) {
 | 
| +    if (r.type() == blink::WebIDBKeyPathTypeString)
 | 
| +      return String::From(r.string());
 | 
| +    else
 | 
| +      return String();
 | 
| +  }
 | 
| +  static Array<String> array(const content::IndexedDBKeyPath& r) {
 | 
| +    if (r.type() == blink::WebIDBKeyPathTypeArray) {
 | 
| +      Array<String> array;
 | 
| +      for (const auto& string : r.array())
 | 
| +        array.push_back(String::From(string));
 | 
| +      return array;
 | 
| +    } else {
 | 
| +      return Array<String>();
 | 
| +    }
 | 
| +  }
 | 
| +  static bool Read(indexed_db::mojom::KeyPathDataView data,
 | 
| +                   content::IndexedDBKeyPath* out) {
 | 
| +    if (data.type() == indexed_db::mojom::KeyPathType::NONE) {
 | 
| +      *out = content::IndexedDBKeyPath();
 | 
| +      return true;
 | 
| +    }
 | 
| +    indexed_db::mojom::KeyPathDataPtr key_path_data;
 | 
| +    if (!data.ReadData(&key_path_data))
 | 
| +      return false;
 | 
| +
 | 
| +    switch (data.type()) {
 | 
| +      case indexed_db::mojom::KeyPathType::NONE:
 | 
| +        NOTREACHED();
 | 
| +        return false;
 | 
| +      case indexed_db::mojom::KeyPathType::STRING:
 | 
| +        if (!key_path_data->is_str())
 | 
| +          return false;
 | 
| +        *out = content::IndexedDBKeyPath(
 | 
| +            base::UTF8ToUTF16(key_path_data->get_str()));
 | 
| +        return true;
 | 
| +      case indexed_db::mojom::KeyPathType::ARRAY:
 | 
| +        if (!key_path_data->is_arr())
 | 
| +          return false;
 | 
| +        // TODO(cmumford): finishme.
 | 
| +        NOTREACHED();
 | 
| +        return true;
 | 
| +    }
 | 
| +
 | 
| +    NOTREACHED();
 | 
| +    return false;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +template <>
 | 
| +struct StructTraits<indexed_db::mojom::IndexMetadata,
 | 
| +                    content::IndexedDBIndexMetadata> {
 | 
| +  static String name(const content::IndexedDBIndexMetadata& r) {
 | 
| +    return String::From(r.name);
 | 
| +  }
 | 
| +  static int64_t id(const content::IndexedDBIndexMetadata& r) { return r.id; }
 | 
| +  static content::IndexedDBKeyPath key_path(
 | 
| +      const content::IndexedDBIndexMetadata& r) {
 | 
| +    return r.key_path;
 | 
| +  }
 | 
| +  static bool unique(const content::IndexedDBIndexMetadata& r) {
 | 
| +    return r.unique;
 | 
| +  }
 | 
| +  static bool multi_entry(const content::IndexedDBIndexMetadata& r) {
 | 
| +    return r.multi_entry;
 | 
| +  }
 | 
| +  static bool Read(indexed_db::mojom::IndexMetadataDataView data,
 | 
| +                   content::IndexedDBIndexMetadata* out) {
 | 
| +    base::string16 name;
 | 
| +    if (!data.ReadName(&name))
 | 
| +      return false;
 | 
| +
 | 
| +    content::IndexedDBKeyPath key_path;
 | 
| +    if (!data.ReadKeyPath(&key_path))
 | 
| +      return false;
 | 
| +
 | 
| +    *out = content::IndexedDBIndexMetadata(name, data.id(), key_path,
 | 
| +                                           data.unique(), data.multi_entry());
 | 
| +
 | 
| +    return true;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +template <>
 | 
| +struct StructTraits<indexed_db::mojom::ObjectStoreMetadata,
 | 
| +                    content::IndexedDBObjectStoreMetadata> {
 | 
| +  // TODO(cmumford): Make this a StringPiece?
 | 
| +  static String name(const content::IndexedDBObjectStoreMetadata& r) {
 | 
| +    return String::From(r.name);
 | 
| +  }
 | 
| +  static int64_t id(const content::IndexedDBObjectStoreMetadata& r) {
 | 
| +    return r.id;
 | 
| +  }
 | 
| +  static content::IndexedDBKeyPath key_path(
 | 
| +      const content::IndexedDBObjectStoreMetadata& r) {
 | 
| +    return r.key_path;
 | 
| +  }
 | 
| +  static bool auto_increment(const content::IndexedDBObjectStoreMetadata& r) {
 | 
| +    return r.auto_increment;
 | 
| +  }
 | 
| +  static int64_t max_index_id(const content::IndexedDBObjectStoreMetadata& r) {
 | 
| +    return r.max_index_id;
 | 
| +  }
 | 
| +  static Map<int64_t, content::IndexedDBIndexMetadata> indexes(
 | 
| +      const content::IndexedDBObjectStoreMetadata& r) {
 | 
| +    return Map<int64_t, content::IndexedDBIndexMetadata>::From(r.indexes);
 | 
| +  }
 | 
| +  static bool Read(indexed_db::mojom::ObjectStoreMetadataDataView data,
 | 
| +                   content::IndexedDBObjectStoreMetadata* out) {
 | 
| +    mojo::String name;
 | 
| +    if (!data.ReadName(&name))
 | 
| +      return false;
 | 
| +
 | 
| +    content::IndexedDBKeyPath key_path;
 | 
| +    if (!data.ReadKeyPath(&key_path))
 | 
| +      return false;
 | 
| +
 | 
| +    // TODO(cmumford): Handle the indexes.
 | 
| +    *out = content::IndexedDBObjectStoreMetadata(
 | 
| +        name.To<base::string16>(), data.id(), key_path, data.auto_increment(),
 | 
| +        data.max_index_id());
 | 
| +
 | 
| +    return true;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +template <>
 | 
| +struct StructTraits<indexed_db::mojom::DatabaseMetadata,
 | 
| +                    content::IndexedDBDatabaseMetadata> {
 | 
| +  static String name(const content::IndexedDBDatabaseMetadata& r) {
 | 
| +    return String::From(r.name);
 | 
| +  }
 | 
| +  static int64_t id(const content::IndexedDBDatabaseMetadata& r) {
 | 
| +    return r.id;
 | 
| +  }
 | 
| +  static int64_t version(const content::IndexedDBDatabaseMetadata& r) {
 | 
| +    return r.version;
 | 
| +  }
 | 
| +  static int64_t max_object_store_id(
 | 
| +      const content::IndexedDBDatabaseMetadata& r) {
 | 
| +    return r.max_object_store_id;
 | 
| +  }
 | 
| +  static Map<int64_t, content::IndexedDBObjectStoreMetadata> object_stores(
 | 
| +      const content::IndexedDBDatabaseMetadata& r) {
 | 
| +    return Map<int64_t, content::IndexedDBObjectStoreMetadata>::From(
 | 
| +        r.object_stores);
 | 
| +  }
 | 
| +  static bool Read(indexed_db::mojom::DatabaseMetadataDataView data,
 | 
| +                   content::IndexedDBDatabaseMetadata* out) {
 | 
| +    mojo::String name;
 | 
| +    if (!data.ReadName(&name))
 | 
| +      return false;
 | 
| +
 | 
| +    *out = content::IndexedDBDatabaseMetadata(name.To<base::string16>(),
 | 
| +                                              data.id(), data.version(),
 | 
| +                                              data.max_object_store_id());
 | 
| +
 | 
| +    return true;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +}  // namespace mojo
 | 
| +
 | 
| +#endif  // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_STRUCT_TRAITS_H_
 | 
| 
 |