// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// File schema for "upgrade" save data.
//
// A platform migrating to Cobalt from a pre-existing HTML5 container may need
// to load save data in the legacy format into Cobalt. In this case, it is
// expected the platform implementation will return the legacy save data in the
// format described by this schema (JSON-encoded data prefixed by a fixed
// identifier), which will then be detected by Cobalt and upgraded to the
// current save data format.

// The first 4 bytes of the data must be the ASCII characters: "UPG0".
// The remainder of the data must be JSON-encoded according to the schema below.
// For details of how the proto3 syntax used here maps to JSON, see:
// https://developers.google.com/protocol-buffers/docs/proto3#json

syntax = "proto3";

message SaveData {
  // Array (possibly empty) of Cookie objects, defined below.
  repeated Cookie cookies = 1;

  // Array (possibly empty) of LocalStorageEntry objects, defined below.
  repeated LocalStorageEntry local_storage_entries = 2;

  // A single cookie.
  message Cookie {
    // URL in canonical form, e.g. "https://www.example.com/". Must be provided
    // or the cookie will be ignored.
    string url = 1;

    // Application-defined key. Must be provided or the cookie will be ignored.
    string name = 2;

    // Application-defined value, treated opaquely by Cobalt. Must be provided
    // or the cookie will be ignored.
    string value = 3;

    // Domain, e.g. ".example.com". Defaults to the domain of the "url" field.
    string domain = 4;

    // Optional virtual path, defaults to "/".
    string path = 5;

    // Microseconds since Windows epoch (1601-01-01 00:00:00 UTC), as ASCII
    // decimal string. Defaults to now.
    int64 creation = 6;

    // Microseconds since Windows epoch (1601-01-01 00:00:00 UTC), as ASCII
    // decimal string. Defaults to maximum expiration period from now.
    int64 expiration = 7;

    // Microseconds since Windows epoch (1601-01-01 00:00:00 UTC), as ASCII
    // decimal string. Defaults to now.
    int64 last_access = 8;

    // Whether this is an HTTP-only cookie. Defaults to false.
    bool http_only = 9;
  }

  // A single local storage entry.
  message LocalStorageEntry {
    // Application-defined key. Must be provided or the local storage entry will
    // be ignored.
    string key = 1;

    // Application-defined value, treated opaquely by Cobalt. Must be provided
    // or the local storage entry will be ignored.
    string value = 2;
  }
}
