cc01272a8d
* chore: bump chromium in DEPS to 95.0.4630.0 * 3133701: Fix chrome root store codegen for cross-compile builds. https://chromium-review.googlesource.com/c/chromium/src/+/3133701 * 49125: Include SHA512-256 in EVP_get_digestbyname and EVP_MD_do_all. https://boringssl-review.googlesource.com/c/boringssl/+/49125 * chore: fixup patch indices * 3131662: [Code Health] Remove ListValue::Append(Integer|Boolean) https://chromium-review.googlesource.com/c/chromium/src/+/3131662 * chore: bump chromium in DEPS to 95.0.4631.0 * chore: update patches * chore: bump chromium in DEPS to 95.0.4635.0 * chore: update patches * chore: bump chromium in DEPS to 95.0.4636.0 * chore: bump chromium in DEPS to 95.0.4637.0 * chore: update patches * refactor: move PlatformNotificationService into BrowserContext Refs: https://chromium-review.googlesource.com/c/chromium/src/+/3137256 * refactor: ListValue::GetSize and ListValue::AppendString were removed Refs: https://chromium-review.googlesource.com/c/chromium/src/+/3144540 * chore: bump chromium in DEPS to 95.0.4638.0 * chore: bump chromium in DEPS to 95.0.4638.4 * chore: bump chromium in DEPS to 96.0.4640.0 * chore: bump chromium in DEPS to 96.0.4641.0 * chore: bump chromium in DEPS to 96.0.4642.0 * chore: update patches Co-authored-by: Michaela Laurencin <mlaurencin@electronjs.org> * 3134756: Move extensions/browser/value_store to components/value_store. Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3134756 * 3150092: [Autofill] Allow aligning Autofill suggestions to the field's center Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3150092 * chore: bump chromium in DEPS to 96.0.4643.0 * chore: update patches * chore: bump chromium in DEPS to 96.0.4644.0 * chore: update patches * chore: bump chromium in DEPS to 96.0.4645.0 * chore: update patches * chore: bump chromium in DEPS to 96.0.4646.0 * chore: bump chromium in DEPS to 96.0.4647.0 * chore: update patches Ref (for chromium): https://chromium-review.googlesource.com/c/chromium/src/+/3165772 * 3162087: Reland "Ensure Branch Target Identification is enabled for executable pages." Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3162087 * chore: update evert_add_inline_and_inline_origin_records_to_symbol_file.patch Xref: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/3166678 Xref: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/3166674 * chore: update Allocator construction Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3135195 Change RefCount::kAllowed/Disallowed semantics into BackupRefPtr::kEnabled/Disabled * chore: add UseConfigurablePool to v8::ArrayBuffer::Allocator invocation Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3090845 * chore: do not set network_context_params.context_name Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3155743 Remove name field from mojom::NetworkContext * fix: use ForEachRenderFrameHost to iterate frames. Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3163336 New implementation partially cribbed from https://source.chromium.org/chromium/chromium/src/+/main:extensions/browser/script_executor.cc;drc=f894f106c6d5fac8e0b75158f622256e0f34f593;l=109 * [Blink Cleanup] Remove WebLocalFrame::RequestExecuteScriptAndReturnValue() Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3149699 ExecuteJavaScript's RequestExecuteScript() new params are cribbed from https://chromium-review.googlesource.com/c/chromium/src/+/3149699/4/third_party/blink/renderer/core/frame/web_local_frame_impl.cc * Remove IsDescendantOf API on RenderFrameHost. Xref: https://chromium-review.googlesource.com/c/chromium/src/+/3165357 function is trivial to implement, so make a local copy in anon namespace * Rewrite IsDescendantOf check to check GetParentOrOuterDocument. https://chromium-review.googlesource.com/c/chromium/src/+/3160061 * Remove GetFramesInSubtree from RenderFrameHost https://chromium-review.googlesource.com/c/chromium/src/+/3163336 * fix: dump_syms for macOS * chore: update patches * [Code Health] Remove ListValue::AppendString and ListValue::GetSize https://chromium-review.googlesource.com/c/chromium/src/+/3144540 * fix: gn check https://chromium-review.googlesource.com/c/chromium/src/+/3163890 * fix: crash with Isolate::GetHeapCodeAndMetadataStatistics https://chromium-review.googlesource.com/c/v8/v8/+/3175820 * chore: update patches * chore: fix windows build * Add kPrintWithPostScriptType42Fonts feature. https://chromium-review.googlesource.com/c/chromium/src/+/3150776 * chore: update patches * chore: fix tests * ozone/x11: fix VA-API. https://chromium-review.googlesource.com/c/chromium/src/+/3141878 * Revert "ozone/x11: fix VA-API." This reverts commit 23e742acb1032bf4afc1a45e4bed38e42184fd01. * Reland "Make Ozone/X11 default." https://chromium-review.googlesource.com/c/chromium/src/+/3114071 * fixup Reland "Make Ozone/X11 default." * fixup Reland "Make Ozone/X11 default." for clipboard Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com> Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com> Co-authored-by: VerteDinde <khammond@slack-corp.com> Co-authored-by: Michaela Laurencin <mlaurencin@electronjs.org> Co-authored-by: VerteDinde <keeleymhammond@gmail.com> Co-authored-by: Charles Kerr <charles@charleskerr.com> Co-authored-by: deepak1556 <hop2deep@gmail.com> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
218 lines
6.5 KiB
C++
218 lines
6.5 KiB
C++
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include <algorithm>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "base/feature_list.h"
|
|
#include "base/i18n/rtl.h"
|
|
#include "chrome/browser/ui/views/autofill/autofill_popup_view_utils.h"
|
|
#include "components/autofill/core/common/autofill_features.h"
|
|
#include "electron/buildflags/buildflags.h"
|
|
#include "mojo/public/cpp/bindings/associated_remote.h"
|
|
#include "shell/browser/native_window_views.h"
|
|
#include "shell/browser/ui/autofill_popup.h"
|
|
#include "shell/common/api/api.mojom.h"
|
|
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
|
|
#include "ui/display/display.h"
|
|
#include "ui/display/screen.h"
|
|
#include "ui/gfx/geometry/point.h"
|
|
#include "ui/gfx/geometry/rect.h"
|
|
#include "ui/gfx/geometry/rect_conversions.h"
|
|
#include "ui/gfx/geometry/vector2d.h"
|
|
#include "ui/gfx/text_utils.h"
|
|
|
|
#if BUILDFLAG(ENABLE_OSR)
|
|
#include "shell/browser/osr/osr_render_widget_host_view.h"
|
|
#include "shell/browser/osr/osr_view_proxy.h"
|
|
#endif
|
|
|
|
namespace electron {
|
|
|
|
AutofillPopup::AutofillPopup() {
|
|
bold_font_list_ = gfx::FontList().DeriveWithWeight(gfx::Font::Weight::BOLD);
|
|
smaller_font_list_ =
|
|
gfx::FontList().DeriveWithSizeDelta(kSmallerFontSizeDelta);
|
|
}
|
|
|
|
AutofillPopup::~AutofillPopup() {
|
|
Hide();
|
|
}
|
|
|
|
void AutofillPopup::CreateView(content::RenderFrameHost* frame_host,
|
|
content::RenderFrameHost* embedder_frame_host,
|
|
bool offscreen,
|
|
views::View* parent,
|
|
const gfx::RectF& r) {
|
|
Hide();
|
|
|
|
frame_host_ = frame_host;
|
|
element_bounds_ = gfx::ToEnclosedRect(r);
|
|
|
|
gfx::Vector2d height_offset(0, element_bounds_.height());
|
|
gfx::Point menu_position(element_bounds_.origin() + height_offset);
|
|
views::View::ConvertPointToScreen(parent, &menu_position);
|
|
popup_bounds_ = gfx::Rect(menu_position, element_bounds_.size());
|
|
|
|
parent_ = parent;
|
|
parent_->AddObserver(this);
|
|
|
|
view_ = new AutofillPopupView(this, parent->GetWidget());
|
|
|
|
#if BUILDFLAG(ENABLE_OSR)
|
|
if (offscreen) {
|
|
auto* rwhv = frame_host->GetView();
|
|
if (embedder_frame_host != nullptr) {
|
|
rwhv = embedder_frame_host->GetView();
|
|
}
|
|
|
|
auto* osr_rwhv = static_cast<OffScreenRenderWidgetHostView*>(rwhv);
|
|
view_->view_proxy_ = std::make_unique<OffscreenViewProxy>(view_);
|
|
osr_rwhv->AddViewProxy(view_->view_proxy_.get());
|
|
}
|
|
#endif
|
|
|
|
// Do this after OSR setup, we check for view_proxy_ when showing
|
|
view_->Show();
|
|
}
|
|
|
|
void AutofillPopup::Hide() {
|
|
if (parent_) {
|
|
parent_->RemoveObserver(this);
|
|
parent_ = nullptr;
|
|
}
|
|
if (view_) {
|
|
view_->Hide();
|
|
view_ = nullptr;
|
|
}
|
|
}
|
|
|
|
void AutofillPopup::SetItems(const std::vector<std::u16string>& values,
|
|
const std::vector<std::u16string>& labels) {
|
|
DCHECK(view_);
|
|
values_ = values;
|
|
labels_ = labels;
|
|
UpdatePopupBounds();
|
|
view_->OnSuggestionsChanged();
|
|
if (view_) // could be hidden after the change
|
|
view_->DoUpdateBoundsAndRedrawPopup();
|
|
}
|
|
|
|
void AutofillPopup::AcceptSuggestion(int index) {
|
|
mojo::AssociatedRemote<mojom::ElectronAutofillAgent> autofill_agent;
|
|
frame_host_->GetRemoteAssociatedInterfaces()->GetInterface(&autofill_agent);
|
|
autofill_agent->AcceptDataListSuggestion(GetValueAt(index));
|
|
}
|
|
|
|
void AutofillPopup::UpdatePopupBounds() {
|
|
DCHECK(parent_);
|
|
gfx::Point origin(element_bounds_.origin());
|
|
views::View::ConvertPointToScreen(parent_, &origin);
|
|
|
|
gfx::Rect bounds(origin, element_bounds_.size());
|
|
gfx::Rect window_bounds = parent_->GetBoundsInScreen();
|
|
|
|
gfx::Size preferred_size =
|
|
gfx::Size(GetDesiredPopupWidth(), GetDesiredPopupHeight());
|
|
|
|
if (base::FeatureList::IsEnabled(
|
|
autofill::features::kAutofillCenterAlignedSuggestions)) {
|
|
popup_bounds_ = CalculatePopupBounds(preferred_size, window_bounds, bounds,
|
|
base::i18n::IsRTL(), true);
|
|
CalculatePopupXAndWidthHorizontallyCentered(
|
|
preferred_size.width(), window_bounds, element_bounds_,
|
|
base::i18n::IsRTL(), &popup_bounds_);
|
|
} else {
|
|
popup_bounds_ = CalculatePopupBounds(preferred_size, window_bounds, bounds,
|
|
base::i18n::IsRTL(), false);
|
|
}
|
|
}
|
|
|
|
gfx::Rect AutofillPopup::popup_bounds_in_view() {
|
|
gfx::Point origin(popup_bounds_.origin());
|
|
views::View::ConvertPointFromScreen(parent_, &origin);
|
|
|
|
return gfx::Rect(origin, popup_bounds_.size());
|
|
}
|
|
|
|
void AutofillPopup::OnViewBoundsChanged(views::View* view) {
|
|
UpdatePopupBounds();
|
|
view_->DoUpdateBoundsAndRedrawPopup();
|
|
}
|
|
|
|
void AutofillPopup::OnViewIsDeleting(views::View* view) {
|
|
Hide();
|
|
}
|
|
|
|
int AutofillPopup::GetDesiredPopupHeight() {
|
|
return 2 * kPopupBorderThickness + values_.size() * kRowHeight;
|
|
}
|
|
|
|
int AutofillPopup::GetDesiredPopupWidth() {
|
|
int popup_width = element_bounds_.width();
|
|
|
|
for (size_t i = 0; i < values_.size(); ++i) {
|
|
int row_size =
|
|
kEndPadding + 2 * kPopupBorderThickness +
|
|
gfx::GetStringWidth(GetValueAt(i), GetValueFontListForRow(i)) +
|
|
gfx::GetStringWidth(GetLabelAt(i), GetLabelFontListForRow(i));
|
|
if (!GetLabelAt(i).empty())
|
|
row_size += kNamePadding + kEndPadding;
|
|
|
|
popup_width = std::max(popup_width, row_size);
|
|
}
|
|
|
|
return popup_width;
|
|
}
|
|
|
|
gfx::Rect AutofillPopup::GetRowBounds(int index) {
|
|
int top = kPopupBorderThickness + index * kRowHeight;
|
|
|
|
return gfx::Rect(kPopupBorderThickness, top,
|
|
popup_bounds_.width() - 2 * kPopupBorderThickness,
|
|
kRowHeight);
|
|
}
|
|
|
|
const gfx::FontList& AutofillPopup::GetValueFontListForRow(int index) const {
|
|
return bold_font_list_;
|
|
}
|
|
|
|
const gfx::FontList& AutofillPopup::GetLabelFontListForRow(int index) const {
|
|
return smaller_font_list_;
|
|
}
|
|
|
|
ui::NativeTheme::ColorId AutofillPopup::GetBackgroundColorIDForRow(
|
|
int index) const {
|
|
return (view_ && index == view_->GetSelectedLine())
|
|
? ui::NativeTheme::kColorId_ResultsTableHoveredBackground
|
|
: ui::NativeTheme::kColorId_ResultsTableNormalBackground;
|
|
}
|
|
|
|
int AutofillPopup::GetLineCount() {
|
|
return values_.size();
|
|
}
|
|
|
|
std::u16string AutofillPopup::GetValueAt(int i) {
|
|
return values_.at(i);
|
|
}
|
|
|
|
std::u16string AutofillPopup::GetLabelAt(int i) {
|
|
return labels_.at(i);
|
|
}
|
|
|
|
int AutofillPopup::LineFromY(int y) const {
|
|
int current_height = kPopupBorderThickness;
|
|
|
|
for (size_t i = 0; i < values_.size(); ++i) {
|
|
current_height += kRowHeight;
|
|
|
|
if (y <= current_height)
|
|
return i;
|
|
}
|
|
|
|
return values_.size() - 1;
|
|
}
|
|
|
|
} // namespace electron
|