// Copyright 2014 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_PUBLIC_COMMON_MANIFEST_H_
#define CONTENT_PUBLIC_COMMON_MANIFEST_H_

#include <stddef.h>
#include <stdint.h>

#include <vector>

#include "base/optional.h"
#include "base/strings/nullable_string16.h"
#include "base/strings/string16.h"
#include "content/common/content_export.h"
#include "third_party/WebKit/public/platform/WebDisplayMode.h"
#include "third_party/WebKit/public/platform/modules/screen_orientation/WebScreenOrientationLockType.h"
#include "ui/gfx/geometry/size.h"
#include "url/gurl.h"

namespace content {

// The Manifest structure is an internal representation of the Manifest file
// described in the "Manifest for Web Application" document:
// http://w3c.github.io/manifest/
struct CONTENT_EXPORT Manifest {
  // Structure representing an icon as per the Manifest specification, see:
  // http://w3c.github.io/manifest/#dfn-icon-object
  struct CONTENT_EXPORT Icon {
    enum IconPurpose {
      ANY = 0,
      BADGE,
    };

    Icon();
    Icon(const Icon& other);
    ~Icon();

    bool operator==(const Icon& other) const;

    // MUST be a valid url. If an icon doesn't have a valid URL, it will not be
    // successfully parsed, thus will not be represented in the Manifest.
    GURL src;

    // Empty if the parsing failed or the field was not present. The type can be
    // any string and doesn't have to be a valid image MIME type at this point.
    // It is up to the consumer of the object to check if the type matches a
    // supported type.
    base::string16 type;

    // Empty if the parsing failed, the field was not present or empty.
    // The special value "any" is represented by gfx::Size(0, 0).
    std::vector<gfx::Size> sizes;

    // Empty if the field was not present or not of type "string". Defaults to
    // a vector with a single value, IconPurpose::ANY, for all other parsing
    // exceptions.
    std::vector<IconPurpose> purpose;
  };

  // Structure representing how a Web Share target handles an incoming share.
  struct CONTENT_EXPORT ShareTarget {
    ShareTarget();
    ~ShareTarget();

    // The URL template that contains placeholders to be replaced with shared
    // data. Null if the parsing failed.
    base::NullableString16 url_template;
  };

  // Structure representing a related application.
  struct CONTENT_EXPORT RelatedApplication {
    RelatedApplication();
    ~RelatedApplication();

    // The platform on which the application can be found. This can be any
    // string, and is interpreted by the consumer of the object. Empty if the
    // parsing failed.
    base::NullableString16 platform;

    // URL at which the application can be found. One of |url| and |id| must be
    // present. Empty if the parsing failed or the field was not present.
    GURL url;

    // An id which is used to represent the application on the platform. One of
    // |url| and |id| must be present. Empty if the parsing failed or the field
    // was not present.
    base::NullableString16 id;
  };

  Manifest();
  Manifest(const Manifest& other);
  ~Manifest();

  // Returns whether this Manifest had no attribute set. A newly created
  // Manifest is always empty.
  bool IsEmpty() const;

  // Null if the parsing failed or the field was not present.
  base::NullableString16 name;

  // Null if the parsing failed or the field was not present.
  base::NullableString16 short_name;

  // Empty if the parsing failed or the field was not present.
  GURL start_url;

  // Set to WebDisplayModeUndefined if the parsing failed or the field was not
  // present.
  blink::WebDisplayMode display;

  // Set to blink::WebScreenOrientationLockDefault if the parsing failed or the
  // field was not present.
  blink::WebScreenOrientationLockType orientation;

  // Empty if the parsing failed, the field was not present, empty or all the
  // icons inside the JSON array were invalid.
  std::vector<Icon> icons;

  // Null if parsing failed or the field was not present.
  // TODO(constantina): This field is non-standard and part of a Chrome
  // experiment. See:
  // https://github.com/WICG/web-share-target/blob/master/docs/interface.md
  // As such, this field should not be exposed to web contents.
  base::Optional<ShareTarget> share_target;

  // Empty if the parsing failed, the field was not present, empty or all the
  // applications inside the array were invalid. The order of the array
  // indicates the priority of the application to use.
  std::vector<RelatedApplication> related_applications;

  // A boolean that is used as a hint for the user agent to say that related
  // applications should be preferred over the web application. False if missing
  // or there is a parsing failure.
  bool prefer_related_applications;

  // This is a 64 bit integer because we need to represent an error state. The
  // color itself should only be 32 bits long if the value is not
  // kInvalidOrMissingColor and can be safely cast to SkColor if is valid.
  // Set to kInvalidOrMissingColor if parsing failed or field is not
  // present.
  int64_t theme_color;

  // This is a 64 bit integer because we need to represent an error state. The
  // color itself should only be 32 bits long if the value is not
  // kInvalidOrMissingColor and can be safely cast to SkColor if is valid.
  // Set to kInvalidOrMissingColor if parsing failed or field is not
  // present.
  int64_t background_color;

  // This is a proprietary extension of the web Manifest, double-check that it
  // is okay to use this entry.
  // Null if parsing failed or the field was not present.
  base::NullableString16 gcm_sender_id;

  // Empty if the parsing failed or the field was not present.
  GURL scope;

  // Maximum length for all the strings inside the Manifest when it is sent over
  // IPC. The renderer process should truncate the strings before sending the
  // Manifest and the browser process must do the same when receiving it.
  static const size_t kMaxIPCStringLength;

  // Constant representing an invalid color. Set to a value outside the
  // range of a 32-bit integer.
  static const int64_t kInvalidOrMissingColor;
};

} // namespace content

#endif // CONTENT_PUBLIC_COMMON_MANIFEST_H_
