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
|
// 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/ui/views/permissions/exclusive_access_permission_prompt.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
#include "chrome/browser/ui/views/permissions/embedded_permission_prompt_content_scrim_view.h"
#include "chrome/browser/ui/views/permissions/exclusive_access_permission_prompt_view.h"
#include "content/public/browser/web_contents.h"
ExclusiveAccessPermissionPrompt::ExclusiveAccessPermissionPrompt(
Browser* browser,
content::WebContents* web_contents,
permissions::PermissionPrompt::Delegate* delegate)
: PermissionPromptDesktop(browser, web_contents, delegate),
delegate_(delegate) {
if (ShowPrompt()) {
LocationBarView* lbv = GetLocationBarView();
// Before showing a chip make sure the LocationBar is in a valid state. That
// fixes a bug when a chip overlays the padlock icon.
lbv->InvalidateLayout();
lbv->GetChipController()->ShowPermissionChip(delegate->GetWeakPtr());
}
}
ExclusiveAccessPermissionPrompt::~ExclusiveAccessPermissionPrompt() {
ClosePrompt();
}
permissions::PermissionPromptDisposition
ExclusiveAccessPermissionPrompt::GetPromptDisposition() const {
return permissions::PermissionPromptDisposition::CUSTOM_MODAL_DIALOG;
}
void ExclusiveAccessPermissionPrompt::DismissScrim() {
delegate_->Dismiss();
}
base::WeakPtr<permissions::PermissionPrompt::Delegate>
ExclusiveAccessPermissionPrompt::GetPermissionPromptDelegate() const {
return delegate_->GetWeakPtr();
}
ExclusiveAccessPermissionPromptView*
ExclusiveAccessPermissionPrompt::GetViewForTesting() {
return static_cast<ExclusiveAccessPermissionPromptView*>(
prompt_view_tracker_.view());
}
bool ExclusiveAccessPermissionPrompt::ShowPrompt() {
raw_ptr<ExclusiveAccessPermissionPromptView> prompt_view =
new ExclusiveAccessPermissionPromptView(browser(),
GetPermissionPromptDelegate());
prompt_view_tracker_.SetView(prompt_view);
scoped_ignore_input_events_ = web_contents()->IgnoreInputEvents(std::nullopt);
content_scrim_widget_ =
EmbeddedPermissionPromptContentScrimView::CreateScrimWidget(
weak_factory_.GetWeakPtr(),
web_contents()->GetColorProvider().GetColor(ui::kColorSysStateScrim),
/*should_dismiss_on_click=*/false);
// If the tab/native view is closed, the `content_scrim_widget_` may be
// nullptr. In this scenario, skip showing the prompt.
if (!content_scrim_widget_) {
return false;
}
prompt_view->UpdateAnchor(content_scrim_widget_.get());
prompt_view->Show();
return true;
}
void ExclusiveAccessPermissionPrompt::ClosePrompt() {
if (auto* prompt_view = static_cast<ExclusiveAccessPermissionPromptView*>(
prompt_view_tracker_.view())) {
prompt_view->PrepareToClose();
if (views::Widget* widget = prompt_view->GetWidget()) {
widget->Close();
}
prompt_view_tracker_.SetView(nullptr);
}
if (content_scrim_widget_) {
content_scrim_widget_->Close();
scoped_ignore_input_events_.reset();
}
}
|