chromium/chrome/browser/ui/views/chrome_views_delegate_lacros.cc

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <memory>

#include "chrome/browser/ui/views/chrome_views_delegate.h"
#include "chromeos/ui/base/window_properties.h"
#include "chromeos/ui/base/window_state_type.h"
#include "chromeos/ui/frame/frame_utils.h"
#include "chromeos/ui/frame/immersive/immersive_fullscreen_controller.h"
#include "chromeos/ui/frame/non_client_frame_view_base.h"
#include "ui/aura/window_observer.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/widget/widget.h"

namespace {

// A NonClientFrameView for framed lacros widgets supporting immersive
// fullscreen.
class NonClientFrameViewLacros : public chromeos::NonClientFrameViewBase,
                                 public aura::WindowObserver {
  METADATA_HEADER(NonClientFrameViewLacros, chromeos::NonClientFrameViewBase)

 public:
  explicit NonClientFrameViewLacros(views::Widget* frame)
      : NonClientFrameViewBase(frame) {
    window_observation_.Observe(frame->GetNativeWindow());
    immersive_fullscreen_controller_.Init(GetHeaderView(), frame,
                                          GetHeaderView());
  }
  NonClientFrameViewLacros(const NonClientFrameViewLacros&) = delete;
  NonClientFrameViewLacros& operator=(const NonClientFrameViewLacros&) = delete;
  ~NonClientFrameViewLacros() override = default;

  // aura::WindowObserver:
  void OnWindowPropertyChanged(aura::Window* window,
                               const void* key,
                               intptr_t old) override {
    if (key == chromeos::kWindowStateTypeKey) {
      const bool is_fullscreen =
          window->GetProperty(chromeos::kWindowStateTypeKey) ==
          chromeos::WindowStateType::kFullscreen;
      chromeos::ImmersiveFullscreenController::EnableForWidget(frame_,
                                                               is_fullscreen);
    }
  }
  void OnWindowDestroying(aura::Window* window) override {
    window_observation_.Reset();
  }

 private:
  chromeos::ImmersiveFullscreenController immersive_fullscreen_controller_;
  base::ScopedObservation<aura::Window, aura::WindowObserver>
      window_observation_{this};
};

BEGIN_METADATA(NonClientFrameViewLacros)
END_METADATA

}  // namespace

std::unique_ptr<views::NonClientFrameView>
ChromeViewsDelegate::CreateDefaultNonClientFrameView(views::Widget* widget) {
  return std::make_unique<NonClientFrameViewLacros>(widget);
}

bool ChromeViewsDelegate::ShouldWindowHaveRoundedCorners(
    gfx::NativeWindow window) const {
  return chromeos::ShouldWindowHaveRoundedCorners(window);
}