// Copyright (c) 2012 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.
//
// Sync protocol datatype extension for sessions.

// Update proto_value_conversions{.h,.cc,_unittest.cc} if you change
// any fields in this file.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;
option retain_unknown_fields = true;

package sync_pb;

import "sync_enums.proto";

message SessionSpecifics {
  // Unique id for the client.
  optional string session_tag = 1;
  optional SessionHeader header = 2;
  optional SessionTab tab = 3;
  
  // The local tab id used by sync. Unique across all nodes for that client.
  optional int32 tab_node_id = 4 [default = -1];
}

// Properties of session sync objects.
message SessionHeader {
  // Each session is composed of windows.
  repeated SessionWindow window = 2;
  // A non-unique but human-readable name to describe this client.
  optional string client_name = 3;
  // The type of device.
  enum DeviceType {
    TYPE_WIN = 1;
    TYPE_MAC = 2;
    TYPE_LINUX = 3;
    TYPE_CROS = 4;
    TYPE_OTHER = 5;
    TYPE_PHONE = 6;
    TYPE_TABLET = 7;
  }
  optional DeviceType device_type = 4;
}

message SessionWindow {
  // Unique (to the owner) id for this window.
  optional int32 window_id = 1;
  // Index of the selected tab in tabs; -1 if no tab is selected.
  optional int32 selected_tab_index = 2 [default = -1];
  // Type of the browser. Currently we only store browsers of type
  // TYPE_TABBED and TYPE_POPUP.
  enum BrowserType {
    TYPE_TABBED = 1;
    TYPE_POPUP = 2;
  }
  optional BrowserType browser_type = 3 [default = TYPE_TABBED];
  // The tabs that compose a window (correspond to tab id's).
  repeated int32 tab = 4;
}

message SessionTab {
  // Unique (to the owner) id for this tab.
  optional int32 tab_id = 1;
  // The unique id for the window this tab belongs to.
  optional int32 window_id = 2;
  // Visual index of the tab within its window. There may be gaps in these
  // values.
  optional int32 tab_visual_index = 3 [default = -1];
  // Identifies the index of the current navigation in navigations. For
  // example, if this is 2 it means the current navigation is navigations[2].
  optional int32 current_navigation_index = 4 [default = -1];
  // True if the tab is pinned.
  optional bool pinned = 5 [default = false];
  // If non-empty, this tab is an app tab and this is the id of the extension.
  optional string extension_app_id = 6;
  // Tabs are navigated, and the navigation data is here.
  repeated TabNavigation navigation = 7;
  // The favicon for the current url the tab is displaying. Either empty
  // or a valid PNG encoded favicon.
  optional bytes favicon = 8;
  // The type of favicon. For now only normal web favicons are supported.
  enum FaviconType {
    TYPE_WEB_FAVICON = 1;
  }
  optional FaviconType favicon_type = 9;
  // The url of the actual favicon (as opposed to the page using the favicon).
  optional string favicon_source = 11;
}

message TabNavigation {
  // The index in the NavigationController. If this is -1, it means this
  // TabNavigation is bogus.
  // optional int32 index = 1 [default = -1];  // obsolete.
  // The virtual URL, when nonempty, will override the actual URL of the page
  // when we display it to the user.
  optional string virtual_url = 2;
  // The referring URL, which can be empty.
  optional string referrer = 3;
  // The title of the page.
  optional string title = 4;
  // Content state is an opaque blob created by WebKit that represents the
  // state of the page. This includes form entries and scroll position for each
  // frame.
  optional string state = 5;
  optional SyncEnums.PageTransition page_transition = 6 [default = TYPED];
  optional SyncEnums.PageTransitionQualifier navigation_qualifier = 7;
  // The unique navigation id (within this client).
  optional int32 unique_id = 8;
  // Timestamp for when this navigation last occurred (in client time).
  // If the user goes back/foward in history the timestamp may refresh.
  optional int64 timestamp = 9;
}

