blob: 649cd9c8a273ddcbe90b38d968f20f2d6f4c6b45 [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_MULTI_CONTENTS_VIEW_DELEGATE_H_
#define CHROME_BROWSER_UI_VIEWS_FRAME_MULTI_CONTENTS_VIEW_DELEGATE_H_
#include "chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.h"
class TabStripModel;
class Browser;
namespace content {
class WebContents;
} // namespace content
class MultiContentsViewDelegate
: public MultiContentsViewDropTargetController::DropDelegate {
public:
~MultiContentsViewDelegate() override = default;
virtual void WebContentsFocused(content::WebContents* contents) = 0;
virtual void ResizeWebContents(double ratio, bool done_resizing) = 0;
virtual void ReverseWebContents() = 0;
};
// Executes browser and tabstrip dependent behaviors on behalf of a
// `MultiContentsView`, such as handling drag and drop entrypoints, and general
// tabstrip operations.
class MultiContentsViewDelegateImpl : public MultiContentsViewDelegate {
public:
explicit MultiContentsViewDelegateImpl(Browser& browser);
MultiContentsViewDelegateImpl(const MultiContentsViewDelegateImpl&) = delete;
MultiContentsViewDelegateImpl& operator=(
const MultiContentsViewDelegateImpl&) = delete;
~MultiContentsViewDelegateImpl() override = default;
// Activates the focused contents.
void WebContentsFocused(content::WebContents* contents) override;
// Updates the split sizing ratio.
// Must already be in a split.
void ResizeWebContents(double ratio, bool done_resizing) override;
// Reverses the order of split tabs.
// Must already be in a split.
void ReverseWebContents() override;
// Creates a new tab for the first valid URL in `urls` and creates a split
// with it and the active tab. If all URLs are blocked, then it will open
// that.
void HandleLinkDrop(MultiContentsDropTargetView::DropSide side,
const ui::DropTargetEvent& event) override;
// Detaches a dragged tab from its current tabstrip and inserts it into a
// split view in this delegate's tab strip.
void HandleTabDrop(MultiContentsDropTargetView::DropSide side,
TabDragDelegate::DragController& drag_controller) override;
private:
// TODO(crbug.com/431000266): Use a browser window feature instead.
const raw_ref<Browser> browser_;
const raw_ref<TabStripModel> tab_strip_model_;
};
#endif // CHROME_BROWSER_UI_VIEWS_FRAME_MULTI_CONTENTS_VIEW_DELEGATE_H_