// Copyright (c) 2019 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.

#include "libcef/browser/web_contents_dialog_helper.h"

#include "libcef/browser/browser_platform_delegate.h"

#include "chrome/browser/platform_util.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"

#if defined(USE_AURA)
#include "ui/views/widget/widget.h"
#endif

CefWebContentsDialogHelper::CefWebContentsDialogHelper(
    content::WebContents* web_contents,
    CefBrowserPlatformDelegate* browser_delegate)
    : browser_delegate_(browser_delegate), weak_factory_(this) {
  web_modal::WebContentsModalDialogManager::CreateForWebContents(web_contents);
  web_modal::WebContentsModalDialogManager::FromWebContents(web_contents)
      ->SetDelegate(this);
}

base::RepeatingClosure CefWebContentsDialogHelper::GetBoundsChangedCallback() {
  return base::BindRepeating(&CefWebContentsDialogHelper::OnBoundsChanged,
                             weak_factory_.GetWeakPtr());
}

bool CefWebContentsDialogHelper::IsWebContentsVisible(
    content::WebContents* web_contents) {
  return platform_util::IsVisible(web_contents->GetNativeView());
}

web_modal::WebContentsModalDialogHost*
CefWebContentsDialogHelper::GetWebContentsModalDialogHost() {
  return this;
}

gfx::NativeView CefWebContentsDialogHelper::GetHostView() const {
#if defined(USE_AURA)
  return browser_delegate_->GetWindowWidget()->GetNativeView();
#else
  NOTIMPLEMENTED();
  return gfx::NativeView();
#endif
}

gfx::Point CefWebContentsDialogHelper::GetDialogPosition(
    const gfx::Size& size) {
  return browser_delegate_->GetDialogPosition(size);
}

gfx::Size CefWebContentsDialogHelper::GetMaximumDialogSize() {
  return browser_delegate_->GetMaximumDialogSize();
}

void CefWebContentsDialogHelper::AddObserver(
    web_modal::ModalDialogHostObserver* observer) {
  if (observer && !observer_list_.HasObserver(observer))
    observer_list_.AddObserver(observer);
}

void CefWebContentsDialogHelper::RemoveObserver(
    web_modal::ModalDialogHostObserver* observer) {
  observer_list_.RemoveObserver(observer);
}

void CefWebContentsDialogHelper::OnBoundsChanged() {
  for (auto& observer : observer_list_)
    observer.OnPositionRequiresUpdate();
}
