// Copyright (c) 2015 The Chromium Embedded Framework 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 CEF_TESTS_CEFCLIENT_BROWSER_DIALOG_HANDLER_GTK_H_
#define CEF_TESTS_CEFCLIENT_BROWSER_DIALOG_HANDLER_GTK_H_
#pragma once

#include <gtk/gtk.h>

#include "include/base/cef_callback_forward.h"
#include "include/cef_dialog_handler.h"
#include "include/cef_jsdialog_handler.h"

namespace client {

class ClientDialogHandlerGtk : public CefDialogHandler,
                               public CefJSDialogHandler {
 public:
  ClientDialogHandlerGtk();

  // CefDialogHandler methods.
  bool OnFileDialog(CefRefPtr<CefBrowser> browser,
                    FileDialogMode mode,
                    const CefString& title,
                    const CefString& default_file_path,
                    const std::vector<CefString>& accept_filters,
                    int selected_accept_filter,
                    CefRefPtr<CefFileDialogCallback> callback) override;

  // CefJSDialogHandler methods.
  bool OnJSDialog(CefRefPtr<CefBrowser> browser,
                  const CefString& origin_url,
                  JSDialogType dialog_type,
                  const CefString& message_text,
                  const CefString& default_prompt_text,
                  CefRefPtr<CefJSDialogCallback> callback,
                  bool& suppress_message) override;
  bool OnBeforeUnloadDialog(CefRefPtr<CefBrowser> browser,
                            const CefString& message_text,
                            bool is_reload,
                            CefRefPtr<CefJSDialogCallback> callback) override;
  void OnResetDialogState(CefRefPtr<CefBrowser> browser) override;

 private:
  struct OnFileDialogParams {
    CefRefPtr<CefBrowser> browser;
    FileDialogMode mode;
    CefString title;
    CefString default_file_path;
    std::vector<CefString> accept_filters;
    int selected_accept_filter;
    CefRefPtr<CefFileDialogCallback> callback;
  };
  void OnFileDialogContinue(OnFileDialogParams params, GtkWindow* window);

  struct OnJSDialogParams {
    CefRefPtr<CefBrowser> browser;
    CefString origin_url;
    JSDialogType dialog_type;
    CefString message_text;
    CefString default_prompt_text;
    CefRefPtr<CefJSDialogCallback> callback;
  };
  void OnJSDialogContinue(OnJSDialogParams params, GtkWindow* window);

  void GetWindowAndContinue(CefRefPtr<CefBrowser> browser,
                            base::OnceCallback<void(GtkWindow*)> callback);

  static void OnDialogResponse(GtkDialog* dialog,
                               gint response_id,
                               ClientDialogHandlerGtk* handler);

  GtkWidget* gtk_dialog_;
  CefRefPtr<CefJSDialogCallback> js_dialog_callback_;

  IMPLEMENT_REFCOUNTING(ClientDialogHandlerGtk);
  DISALLOW_COPY_AND_ASSIGN(ClientDialogHandlerGtk);
};

}  // namespace client

#endif  // CEF_TESTS_CEFCLIENT_BROWSER_DIALOG_HANDLER_GTK_H_