// third_party/blink/public/mojom/autoplay/autoplay.mojom.h is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2013 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_MOJOM_AUTOPLAY_AUTOPLAY_MOJOM_H_
#define THIRD_PARTY_BLINK_PUBLIC_MOJOM_AUTOPLAY_AUTOPLAY_MOJOM_H_

#include <stdint.h>

#include <limits>
#include <type_traits>
#include <utility>

#include "third_party/abseil-cpp/absl/types/optional.h"
#include "mojo/public/cpp/bindings/clone_traits.h"
#include "mojo/public/cpp/bindings/equals_traits.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "mojo/public/cpp/bindings/union_traits.h"

#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"

#include "third_party/blink/public/mojom/autoplay/autoplay.mojom-shared.h"
#include "third_party/blink/public/mojom/autoplay/autoplay.mojom-forward.h"
#include "url/mojom/origin.mojom.h"
#include <string>
#include <vector>

#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"


#include "third_party/blink/public/common/common_export.h"

#ifdef KYTHE_IS_RUNNING
#pragma kythe_inline_metadata "Metadata comment"
#endif


namespace blink {
namespace mojom {

class AutoplayConfigurationClientProxy;

template <typename ImplRefTraits>
class AutoplayConfigurationClientStub;

class AutoplayConfigurationClientRequestValidator;


// @generated_from: blink.mojom.AutoplayConfigurationClient
class BLINK_COMMON_EXPORT AutoplayConfigurationClient
    : public AutoplayConfigurationClientInterfaceBase {
 public:
  static const char Name_[];
  static std::pair<uint32_t, const void*> MessageToMethodInfo_(mojo::Message& message);
  static const char* MessageToMethodName_(mojo::Message& message);
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;
  static constexpr bool HasUninterruptableMethods_ = false;

  using Base_ = AutoplayConfigurationClientInterfaceBase;
  using Proxy_ = AutoplayConfigurationClientProxy;

  template <typename ImplRefTraits>
  using Stub_ = AutoplayConfigurationClientStub<ImplRefTraits>;

  using RequestValidator_ = AutoplayConfigurationClientRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kAddAutoplayFlagsMinVersion = 0,
  };

// crbug.com/1340245 - this causes binary size bloat on Fuchsia, and we're OK
// with not having this data in traces there.
#if !BUILDFLAG(IS_FUCHSIA)
  struct AddAutoplayFlags_Sym {
    NOINLINE static void IPCSymbol();
  };
#endif // !BUILDFLAG(IS_FUCHSIA)
  virtual ~AutoplayConfigurationClient() = default;

  
// @generated_from: blink.mojom.AutoplayConfigurationClient.AddAutoplayFlags
  virtual void AddAutoplayFlags(const ::url::Origin& origin, int32_t flags) = 0;
};



// @generated_from: blink.mojom.AutoplayConfigurationClient
class BLINK_COMMON_EXPORT AutoplayConfigurationClientProxy
    : public AutoplayConfigurationClient {
 public:
  using InterfaceType = AutoplayConfigurationClient;

  explicit AutoplayConfigurationClientProxy(mojo::MessageReceiverWithResponder* receiver);
  
// @generated_from: blink.mojom.AutoplayConfigurationClient.AddAutoplayFlags
  void AddAutoplayFlags(const ::url::Origin& origin, int32_t flags) final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};
class BLINK_COMMON_EXPORT AutoplayConfigurationClientStubDispatch {
 public:
  static bool Accept(AutoplayConfigurationClient* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      AutoplayConfigurationClient* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<AutoplayConfigurationClient>>
class AutoplayConfigurationClientStub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  AutoplayConfigurationClientStub() = default;
  ~AutoplayConfigurationClientStub() override = default;

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return AutoplayConfigurationClientStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return AutoplayConfigurationClientStubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};
class BLINK_COMMON_EXPORT AutoplayConfigurationClientRequestValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};





}  // namespace mojom
}  // namespace blink

namespace mojo {

}  // namespace mojo

#endif  // THIRD_PARTY_BLINK_PUBLIC_MOJOM_AUTOPLAY_AUTOPLAY_MOJOM_H_

/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMTc2NywgImJlZ2luIjogMTc0MCwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogImJsaW5rLm1vam9tLkF1dG9wbGF5Q29uZmlndXJhdGlv
bkNsaWVudCJ9fSwgeyJlbmQiOiAzMDY3LCAiYmVnaW4iOiAzMDUxLCAiZWRnZSI6ICIlL2t5dGhl
L2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNv
cnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFn
ZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAiYmxpbmsubW9qb20uQXV0b3BsYXlDb25maWd1cmF0
aW9uQ2xpZW50LkFkZEF1dG9wbGF5RmxhZ3MifX0sIHsiZW5kIjogMzU0MiwgImJlZ2luIjogMzUy
NiwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZp
bmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJv
bWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogImJsaW5rLm1vam9t
LkF1dG9wbGF5Q29uZmlndXJhdGlvbkNsaWVudC5BZGRBdXRvcGxheUZsYWdzIn19XSwgInR5cGUi
OiAia3l0aGUwIn0=
*/