// Copyright 2021 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_CONTEXT_MENU_DATA_CONTEXT_MENU_MOJOM_TRAITS_H_
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_CONTEXT_MENU_DATA_CONTEXT_MENU_MOJOM_TRAITS_H_

#include "build/build_config.h"
#include "mojo/public/cpp/base/time_mojom_traits.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "third_party/blink/public/common/common_export.h"
#include "third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h"
#include "third_party/blink/public/common/navigation/impression.h"
#include "third_party/blink/public/mojom/context_menu/context_menu.mojom.h"
#include "url/mojom/url_gurl_mojom_traits.h"

namespace mojo {

template <>
struct BLINK_COMMON_EXPORT
    StructTraits<blink::mojom::ImpressionDataView, blink::Impression> {
  static url::Origin conversion_destination(const blink::Impression& r) {
    return r.conversion_destination;
  }

  static base::Optional<url::Origin> reporting_origin(
      const blink::Impression& r) {
    return r.reporting_origin;
  }

  static uint64_t impression_data(const blink::Impression& r) {
    return r.impression_data;
  }

  static base::Optional<base::TimeDelta> expiry(const blink::Impression& r) {
    return r.expiry;
  }

  static bool Read(blink::mojom::ImpressionDataView r, blink::Impression* out);
};

template <>
struct BLINK_COMMON_EXPORT
    StructTraits<blink::mojom::UntrustworthyContextMenuParamsDataView,
                 blink::UntrustworthyContextMenuParams> {
  static blink::mojom::ContextMenuDataMediaType media_type(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.media_type;
  }

  static int x(const blink::UntrustworthyContextMenuParams& r) { return r.x; }

  static int y(const blink::UntrustworthyContextMenuParams& r) { return r.y; }

  static const GURL link_url(const blink::UntrustworthyContextMenuParams& r) {
    return r.link_url;
  }

  static base::string16 link_text(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.link_text;
  }

  static base::Optional<blink::Impression> impression(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.impression;
  }

  static const GURL unfiltered_link_url(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.unfiltered_link_url;
  }

  static const GURL src_url(const blink::UntrustworthyContextMenuParams& r) {
    return r.src_url;
  }

  static bool has_image_contents(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.has_image_contents;
  }

  static int media_flags(const blink::UntrustworthyContextMenuParams& r) {
    return r.media_flags;
  }

  static base::string16 selection_text(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.selection_text;
  }

  static base::string16 title_text(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.title_text;
  }

  static base::string16 alt_text(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.alt_text;
  }

  static base::string16 suggested_filename(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.suggested_filename;
  }

  static base::string16 misspelled_word(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.misspelled_word;
  }

  static std::vector<base::string16> dictionary_suggestions(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.dictionary_suggestions;
  }

  static bool spellcheck_enabled(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.spellcheck_enabled;
  }

  static bool is_editable(const blink::UntrustworthyContextMenuParams& r) {
    return r.is_editable;
  }

  static int writing_direction_default(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.writing_direction_default;
  }

  static int writing_direction_left_to_right(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.writing_direction_left_to_right;
  }

  static int writing_direction_right_to_left(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.writing_direction_right_to_left;
  }

  static int edit_flags(const blink::UntrustworthyContextMenuParams& r) {
    return r.edit_flags;
  }

  static std::string frame_charset(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.frame_charset;
  }

  static network::mojom::ReferrerPolicy referrer_policy(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.referrer_policy;
  }

  static const GURL& link_followed(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.link_followed;
  }

  static const std::vector<blink::mojom::CustomContextMenuItemPtr>&
  custom_items(const blink::UntrustworthyContextMenuParams& r) {
    return r.custom_items;
  }

  static ui::MenuSourceType source_type(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.source_type;
  }

  static blink::mojom::ContextMenuDataInputFieldType input_field_type(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.input_field_type;
  }

  static gfx::Rect selection_rect(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.selection_rect;
  }

  static int selection_start_offset(
      const blink::UntrustworthyContextMenuParams& r) {
    return r.selection_start_offset;
  }

  static bool Read(blink::mojom::UntrustworthyContextMenuParamsDataView r,
                   blink::UntrustworthyContextMenuParams* out);
};

}  // namespace mojo

#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_CONTEXT_MENU_DATA_CONTEXT_MENU_MOJOM_TRAITS_H_
