1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
// Copyright 2024 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/glic/widget/glic_view.h"
#include "base/command_line.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/browser_element_identifiers.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/browser/ui/layout_constants.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/frame/tab_strip_region_view.h"
#include "chrome/browser/ui/views/tabs/glic_button.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/web_contents.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/events/event_observer.h"
#include "ui/views/event_monitor.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/view_class_properties.h"
#include "ui/views/widget/widget.h"
namespace glic {
DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(GlicView, kWebViewElementIdForTesting);
GlicView::GlicView(Profile* profile,
const gfx::Size& initial_size,
base::WeakPtr<ui::AcceleratorTarget> accelerator_delegate)
: accelerator_delegate_(accelerator_delegate) {
SetProperty(views::kElementIdentifierKey, kGlicViewElementId);
SetLayoutManager(std::make_unique<views::FillLayout>());
SetSize(initial_size);
// As there is no WebContents yet, this will apply the default background.
UpdateBackgroundColor();
}
GlicView::~GlicView() = default;
void GlicView::SetDraggableAreas(
const std::vector<gfx::Rect>& draggable_areas) {
draggable_areas_.assign(draggable_areas.begin(), draggable_areas.end());
}
bool GlicView::IsPointWithinDraggableArea(const gfx::Point& point) {
for (const gfx::Rect& rect : draggable_areas_) {
if (rect.Contains(point)) {
return true;
}
}
return false;
}
void GlicView::UpdatePrimaryDraggableAreaOnResize() {
if (draggable_areas_.empty()) {
return;
}
draggable_areas_[0].set_width(width());
}
void GlicView::UpdateBackgroundColor() {
const bool explicit_background =
base::FeatureList::IsEnabled(features::kGlicExplicitBackgroundColor);
std::unique_ptr<views::Background> background;
if (!explicit_background) {
std::optional<SkColor> client_background = GetClientBackgroundColor();
if (client_background) {
background = views::CreateSolidBackground(*client_background);
}
}
if (!background) {
background = views::CreateSolidBackground(kColorGlicBackground);
}
SetBackground(std::move(background));
if (views::Widget* widget = GetWidget(); explicit_background && widget) {
// Set the native widget background color if needed.
widget->SetColorModeOverride(
/*color_mode_override=*/std::nullopt,
ui::ColorVariant(kColorGlicBackground)
.ResolveToSkColor(widget->GetColorProvider()));
}
}
bool GlicView::AcceleratorPressed(const ui::Accelerator& accelerator) {
if (accelerator_delegate_) {
return accelerator_delegate_->AcceleratorPressed(accelerator);
}
return false;
}
std::optional<SkColor> GlicView::GetClientBackgroundColor() {
content::WebContents* host = GetWebContents();
if (!host) {
return std::nullopt;
}
std::vector<content::WebContents*> inner_contents =
host->GetInnerWebContents();
if (inner_contents.size() != 1ul) {
return std::nullopt;
}
return inner_contents[0]->GetBackgroundColor();
}
BEGIN_METADATA(GlicView)
END_METADATA
} // namespace glic
|