// 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/webui_browser/browser_elements_webui_browser.h"

#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "ui/base/interaction/safe_castable.h"
#include "ui/views/interaction/element_tracker_views.h"

DEFINE_SAFE_CAST_SUBCLASS(BrowserElementsWebUiBrowser, BrowserElementsViews)

BrowserElementsWebUiBrowser::BrowserElementsWebUiBrowser(
    BrowserWindowInterface& browser)
    : BrowserElementsViews(browser) {}

BrowserElementsWebUiBrowser::~BrowserElementsWebUiBrowser() = default;

// static
BrowserElementsWebUiBrowser* BrowserElementsWebUiBrowser::From(
    BrowserWindowInterface* browser) {
  auto* const base = BrowserElements::From(browser);
  return base ? base->AsA<BrowserElementsWebUiBrowser>() : nullptr;
}

void BrowserElementsWebUiBrowser::Init(views::Widget* browser_widget) {
  // TODO(webium): Fix ChromeOS. On ChromeOS, browser_widget is null because of
  // a memory issue in WebUIBrowserWindow::GetNativeWindow(). See the comment
  // there.
#if !BUILDFLAG(IS_CHROMEOS)
  CHECK(browser_widget);
#endif
  browser_widget_ = browser_widget;
}

void BrowserElementsWebUiBrowser::TearDown() {
  browser_widget_ = nullptr;
}

ui::ElementContext BrowserElementsWebUiBrowser::GetContext() {
  // During initialization, the browser widget may not have been
  // set yet (e.g. BookmarkBarController is initialized before the
  // window's construction is complete). Returning an empty context
  // allows element lookups to fail gracefully instead of crashing.
  // TODO(webium): Move the initialization of features to a point after the
  // widget is ready.
  if (!browser_widget_) {
    return ui::ElementContext();
  }

  return views::ElementTrackerViews::GetContextForWidget(browser_widget_);
}

views::Widget* BrowserElementsWebUiBrowser::GetPrimaryWindowWidget() {
  return browser_widget_;
}

bool BrowserElementsWebUiBrowser::IsInitialized() const {
  return browser_widget_ != nullptr;
}
