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