// 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::Callback<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_
