// Copyright 2009 Google Inc. All Rights Reserved.
// Author: micapolos@google.com (Michal Pociecha-Los)
//
// Messages containing DOM data captured from the browser.
// It includes the structure of the HTML document and Navigator data.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package userfeedback;

// Data captured from HTMLDocument DOM object.
message HtmlDocument {

  // The value of document.URL property.
  required string url = 1;

  // The value of document.title property.
  optional string title = 2;

  // The value of document.documentElement property.
  optional HtmlElement document_element = 3;
};

// Data captured from HTMLElement DOM object.
message HtmlElement {

  // The value of element.tagName property.
  required string tag_name = 1;

  // The value of element.id property.
  optional string id = 2;

  // The value of element.className property.
  optional string class_name = 3;

  // A list of child elements.
  repeated HtmlElement child_element = 4;

  // The value of frame.contentDocument property for FRAME and IFRAME elements.
  optional HtmlDocument frame_content_document = 5;
};

// Data captured from DOM Navigator object.
message Navigator {

  // The value of 'navigator.appCodeName' property.
  optional string app_code_name = 1;

  // The value of 'navigator.appName' property.
  optional string app_name = 2;

  // The value of 'navigator.appVersion' property.
  optional string app_version = 3;

  // The value of 'navigator.appMinorVersion' property.
  optional string app_minor_version = 4;

  // The value of 'navigator.cookieEnabled' property.
  optional bool cookie_enabled = 5;

  // The value of 'navigator.cpuClass' property.
  optional string cpu_class = 6;

  // The value of 'navigator.onLine' property.
  optional bool on_line = 7;

  // The value of 'navigator.platform' property.
  optional string platform = 8;

  // The value of 'navigator.browserLanguage' property.
  optional string browser_language = 9;

  // The value of 'navigator.systemLanguage' property.
  optional string system_language = 10;

  // The value of 'navigator.userAgent' property.
  optional string user_agent = 11;

  // The return value of 'navigator.javaEnabled()' method.
  optional bool java_enabled = 12;

  // The return value of 'navigator.taintEnabled()' method.
  optional bool taint_enabled = 13;

  // Plugin names specified by 'navigator.plugins' property.
  repeated string plugin_name = 14;
};

// A path in the HTML document between two elements, which are in the
// ancestor-descendant relationship.
message HtmlPath {

  // Ordered list of zero-based indices.
  // Empty path selects root element.
  // Non-negative index N selects (N+1)-th child.
  // Index -1 selects root element from frame content document.
  repeated int32 index = 1;
};
