blob: 0fa0ce2d50eaa588c77cb804e449827cf8567c40 [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.
#include "chrome/browser/ui/read_anything/read_anything_controller.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
#include "chrome/browser/ui/tabs/public/tab_features.h"
#include "chrome/browser/ui/tabs/tab_model.h"
#include "chrome/browser/ui/views/side_panel/side_panel_entry_id.h"
#include "chrome/browser/ui/views/side_panel/side_panel_ui.h"
#include "content/public/browser/web_contents.h"
#include "ui/accessibility/accessibility_features.h"
DEFINE_USER_DATA(ReadAnythingController);
ReadAnythingController* ReadAnythingController::From(tabs::TabInterface* tab) {
return Get(tab->GetUnownedUserDataHost());
}
ReadAnythingController::ReadAnythingController(tabs::TabInterface* tab)
: tab_(tab),
scoped_unowned_user_data_(tab->GetUnownedUserDataHost(), *this) {
// This controller should only be instantiated if
// IsImmersiveReadAnythingEnabled is enabled
CHECK(features::IsImmersiveReadAnythingEnabled());
}
ReadAnythingController::~ReadAnythingController() = default;
// Returns the SidePanelUI for the active tab if the tab is active and has a
// browser window interface. Returns nullptr otherwise.
SidePanelUI* ReadAnythingController::GetSidePanelUI() {
CHECK(tab_);
CHECK(tab_->IsActivated());
CHECK(tab_->GetBrowserWindowInterface());
return tab_->GetBrowserWindowInterface()->GetFeatures().side_panel_ui();
}
// TODO(crbug.com/447418049): Open immersive reading mode via this
// entrypoint. Currently just open side panel reading mode via
// ReadAnythingController when is_immersive_read_anything_enabled_ flag is
// enabled.
void ReadAnythingController::ShowUI(SidePanelOpenTrigger trigger) {
if (SidePanelUI* side_panel_ui = GetSidePanelUI()) {
side_panel_ui->Show(SidePanelEntryId::kReadAnything, trigger);
}
}
// TODO(crbug.com/447418049): Toggle immersive reading mode via this
// entrypoint. Currently just toggle side panel reading mode via
// ReadAnythingController when is_immersive_read_anything_enabled_ flag is
// enabled.
void ReadAnythingController::ToggleReadAnythingSidePanel(
SidePanelOpenTrigger trigger) {
if (SidePanelUI* side_panel_ui = GetSidePanelUI()) {
side_panel_ui->Toggle(SidePanelEntryKey(SidePanelEntryId::kReadAnything),
trigger);
}
}
// TODO(crbug.com/458335664): Add logic to check if IRM SidePanel is showing
ReadAnythingController::PresentationState
ReadAnythingController::GetPresentationState() const {
if (tab_ && tab_->GetBrowserWindowInterface()) {
SidePanelUI* side_panel_ui =
tab_->GetBrowserWindowInterface()->GetFeatures().side_panel_ui();
if (side_panel_ui &&
side_panel_ui->IsSidePanelEntryShowing(
SidePanelEntryKey(SidePanelEntryId::kReadAnything))) {
return PresentationState::kInSidePanel;
}
}
return PresentationState::kInactive;
}