| // 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_DEVTOOLS_DEVTOOLS_UI_CONTROLLER_H_ |
| #define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_CONTROLLER_H_ |
| |
| #include <memory> |
| |
| #include "base/callback_list.h" |
| #include "base/memory/raw_ptr.h" |
| #include "ui/base/unowned_user_data/scoped_unowned_user_data.h" |
| #include "ui/views/focus/external_focus_tracker.h" |
| |
| class BrowserWindowInterface; |
| class ContentsContainerView; |
| |
| namespace content { |
| class WebContents; |
| } // namespace content |
| |
| namespace views { |
| class WebView; |
| } // namespace views |
| |
| // DevtoolsUIController handles managing the state of the devtools views. |
| class DevtoolsUIController { |
| public: |
| DECLARE_USER_DATA(DevtoolsUIController); |
| |
| DevtoolsUIController( |
| BrowserWindowInterface* browser, |
| const std::vector<raw_ptr<ContentsContainerView, DanglingUntriaged>>& |
| contents_container_views); |
| ~DevtoolsUIController(); |
| |
| DevtoolsUIController(const DevtoolsUIController&) = delete; |
| DevtoolsUIController& operator=(const DevtoolsUIController&) = delete; |
| |
| static DevtoolsUIController* From(BrowserWindowInterface* browser); |
| |
| void TearDown(); |
| |
| bool UpdateDevtools(content::WebContents* web_contents, |
| bool update_devtools_web_contents = true); |
| |
| // Returns true if the browser window can dock a DevTools panel. |
| bool CanDockDevtools() const; |
| |
| // Updates the visibility of the scrim that covers the devtools area. |
| void SetDevtoolsScrimVisibility(content::WebContents* web_contents, |
| bool visible); |
| |
| private: |
| // Controller for a single DevtoolsWebView owned by |contents_container_view|. |
| // Manages updating the devtools window. |
| class DevtoolsWebViewController { |
| public: |
| explicit DevtoolsWebViewController( |
| ContentsContainerView* contents_container_view); |
| DevtoolsWebViewController(const DevtoolsWebViewController&) = delete; |
| DevtoolsWebViewController& operator=(const DevtoolsWebViewController&) = |
| delete; |
| ~DevtoolsWebViewController(); |
| |
| void OnWebContentsAttached(views::WebView* web_view); |
| void OnWebContentsDetached(views::WebView* web_view); |
| |
| // Updates devtools window for given contents. This method will show docked |
| // devtools window for inspected |web_contents| that has docked devtools |
| // and hide it for null or not inspected |web_contents|. It will also make |
| // sure devtools window size and position are restored for given tab. |
| // This method will not update actual DevTools WebContents, if not |
| // |update_devtools_web_contents|. Returns true if devtools changes |
| // visibility or the resizing strategy is updated. |
| bool UpdateDevtools(content::WebContents* web_contents, |
| bool update_devtools_web_contents = true); |
| |
| void RestoreFocus(); |
| |
| private: |
| raw_ptr<ContentsContainerView> contents_container_view_; |
| // Tracks and stores the last focused view which is not the |
| // devtools_web_view_ or any of its children. Used to restore focus once |
| // the devtools_web_view_ is hidden. |
| std::unique_ptr<views::ExternalFocusTracker> devtools_focus_tracker_; |
| |
| base::CallbackListSubscription web_contents_attached_subscription_; |
| base::CallbackListSubscription web_contents_detached_subscription_; |
| }; |
| |
| std::map<ContentsContainerView*, std::unique_ptr<DevtoolsWebViewController>> |
| devtools_web_view_controllers_; |
| |
| const bool can_dock_devtools_; |
| |
| ui::ScopedUnownedUserData<DevtoolsUIController> scoped_data_holder_; |
| }; |
| |
| #endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_CONTROLLER_H_ |