blob: 670095b555094e3f38854b61f1c5d541f3196387 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_TAB_MODAL_DIALOG_HOST_H_
#define CHROME_BROWSER_UI_VIEWS_FRAME_TAB_MODAL_DIALOG_HOST_H_
#include "base/scoped_observation.h"
#include "components/web_modal/web_contents_modal_dialog_host.h"
#include "ui/views/view.h"
#include "ui/views/view_observer.h"
#include "ui/views/widget/widget_observer.h"
class BrowserView;
class ContentsContainerView;
// Dialog host used specifically for tab modals to help with positioning the tab
// modals relative to its ContentsContainerView.
class TabModalDialogHost : public web_modal::WebContentsModalDialogHost,
public views::WidgetObserver,
public views::ViewObserver {
public:
TabModalDialogHost(BrowserView* browser_view,
ContentsContainerView* contents_container_view);
TabModalDialogHost(const TabModalDialogHost&) = delete;
TabModalDialogHost& operator=(const TabModalDialogHost&) = delete;
~TabModalDialogHost() override;
// web_modal::ModalDialogHost:
gfx::NativeView GetHostView() const override;
gfx::Point GetDialogPosition(const gfx::Size& dialog_size) override;
bool ShouldActivateDialog() const override;
bool ShouldConstrainDialogBoundsByHost() override;
void AddObserver(web_modal::ModalDialogHostObserver* observer) override;
void RemoveObserver(web_modal::ModalDialogHostObserver* observer) override;
// web_modal::WebContentsModalDialogHost:
gfx::Size GetMaximumDialogSize() override;
// views::ViewObserver:
void OnViewAddedToWidget(views::View* observed_view) override;
void OnViewBoundsChanged(views::View* observed_view) override;
// views::WidgetObserver:
void OnWidgetDestroying(views::Widget* browser_widget) override;
void OnWidgetBoundsChanged(views::Widget* browser_widget,
const gfx::Rect& new_bounds) override;
private:
int GetDialogYCoordinate();
void NotifyPositionRequiresUpdate();
const raw_ptr<BrowserView> browser_view_;
const raw_ptr<ContentsContainerView> contents_container_view_;
base::ScopedObservation<views::View, views::ViewObserver>
contents_container_view_observation_{this};
base::ScopedObservation<views::Widget, views::WidgetObserver>
widget_observation_{this};
base::ObserverList<web_modal::ModalDialogHostObserver>::Unchecked
observer_list_;
};
#endif // CHROME_BROWSER_UI_VIEWS_FRAME_TAB_MODAL_DIALOG_HOST_H_