blob: 607bf2a57ecb09d87bd0c57ab5706cfc17ed937b [file] [log] [blame]
// Copyright 2019 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 "chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.h"
#include "base/files/file_path.h"
#include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/chrome_typography.h"
#include "chrome/browser/ui/views/native_file_system/native_file_system_ui_helpers.h"
#include "chrome/grit/generated_resources.h"
#include "components/constrained_window/constrained_window_views.h"
#include "components/url_formatter/elide_url.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/styled_label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/window/dialog_client_view.h"
NativeFileSystemDirectoryAccessConfirmationView::
~NativeFileSystemDirectoryAccessConfirmationView() {
// Make sure the dialog ends up calling the callback no matter what.
if (!callback_.is_null())
Close();
}
// static
views::Widget* NativeFileSystemDirectoryAccessConfirmationView::ShowDialog(
const url::Origin& origin,
const base::FilePath& path,
base::OnceCallback<void(PermissionAction result)> callback,
content::WebContents* web_contents) {
auto delegate =
base::WrapUnique(new NativeFileSystemDirectoryAccessConfirmationView(
origin, path, std::move(callback)));
return constrained_window::ShowWebModalDialogViews(delegate.release(),
web_contents);
}
base::string16 NativeFileSystemDirectoryAccessConfirmationView::GetWindowTitle()
const {
return l10n_util::GetStringUTF16(
IDS_NATIVE_FILE_SYSTEM_DIRECTORY_ACCESS_CONFIRMATION_TITLE);
}
base::string16
NativeFileSystemDirectoryAccessConfirmationView::GetDialogButtonLabel(
ui::DialogButton button) const {
if (button == ui::DIALOG_BUTTON_OK)
return l10n_util::GetStringUTF16(
IDS_NATIVE_FILE_SYSTEM_DIRECTORY_ACCESS_ALLOW_BUTTON);
return l10n_util::GetStringUTF16(IDS_APP_CANCEL);
}
bool NativeFileSystemDirectoryAccessConfirmationView::ShouldShowCloseButton()
const {
return false;
}
bool NativeFileSystemDirectoryAccessConfirmationView::Accept() {
std::move(callback_).Run(PermissionAction::GRANTED);
return true;
}
bool NativeFileSystemDirectoryAccessConfirmationView::Cancel() {
std::move(callback_).Run(PermissionAction::DISMISSED);
return true;
}
gfx::Size
NativeFileSystemDirectoryAccessConfirmationView::CalculatePreferredSize()
const {
const int width = ChromeLayoutProvider::Get()->GetDistanceMetric(
DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) -
margins().width();
return gfx::Size(width, GetHeightForWidth(width));
}
ui::ModalType NativeFileSystemDirectoryAccessConfirmationView::GetModalType()
const {
return ui::MODAL_TYPE_CHILD;
}
views::View*
NativeFileSystemDirectoryAccessConfirmationView::GetInitiallyFocusedView() {
const views::DialogClientView* dcv = GetDialogClientView();
return dcv ? dcv->cancel_button() : nullptr;
}
NativeFileSystemDirectoryAccessConfirmationView::
NativeFileSystemDirectoryAccessConfirmationView(
const url::Origin& origin,
const base::FilePath& path,
base::OnceCallback<void(PermissionAction result)> callback)
: callback_(std::move(callback)) {
const views::LayoutProvider* provider = ChromeLayoutProvider::Get();
SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical,
provider->GetDialogInsetsForContentType(views::TEXT, views::TEXT),
provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL)));
AddChildView(native_file_system_ui_helper::CreateOriginPathLabel(
IDS_NATIVE_FILE_SYSTEM_DIRECTORY_ACCESS_CONFIRMATION_TEXT, origin, path,
CONTEXT_BODY_TEXT_SMALL, /*show_emphasis=*/true));
}
void ShowNativeFileSystemDirectoryAccessConfirmationDialog(
const url::Origin& origin,
const base::FilePath& path,
base::OnceCallback<void(PermissionAction result)> callback,
content::WebContents* web_contents) {
NativeFileSystemDirectoryAccessConfirmationView::ShowDialog(
origin, path, std::move(callback), web_contents);
}