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
|
// 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 "components/headless/select_file_dialog/headless_select_file_dialog.h"
#include "base/memory/ptr_util.h"
#include "ui/gfx/native_widget_types.h"
namespace headless {
// static
HeadlessSelectFileDialogFactory* HeadlessSelectFileDialogFactory::instance_ =
nullptr;
// HeadlessSelectFileDialog implements a stub select file dialog
// that cancels itself as soon as it gets open, optionally calling
// back the owner.
class HeadlessSelectFileDialog : public ui::SelectFileDialog {
public:
HeadlessSelectFileDialog(Listener* listener,
std::unique_ptr<ui::SelectFilePolicy> policy,
SelectFileDialogCallback callback)
: ui::SelectFileDialog(listener, std::move(policy)),
callback_(std::move(callback)) {}
protected:
~HeadlessSelectFileDialog() override = default;
// ui::BaseShellDialog
bool IsRunning(gfx::NativeWindow owning_window) const override {
return false;
}
void ListenerDestroyed() override { listener_ = nullptr; }
// ui::SelectFileDialog
void SelectFileImpl(Type type,
const std::u16string& title,
const base::FilePath& default_path,
const FileTypeInfo* file_types,
int file_type_index,
const base::FilePath::StringType& default_extension,
gfx::NativeWindow owning_window,
void* params,
const GURL* caller) override {
if (callback_) {
std::move(callback_).Run(type);
}
if (listener_) {
listener_->FileSelectionCanceled(/*params=*/nullptr);
}
}
private:
// ui::SelectFileDialog:
bool HasMultipleFileTypeChoicesImpl() override { return false; }
SelectFileDialogCallback callback_;
};
// HeadlessSelectFileDialogFactory creates cancelable SelectFileDialog's
// static
void HeadlessSelectFileDialogFactory::SetUp() {
ui::SelectFileDialog::SetFactory(
// Private constructor.
base::WrapUnique(new HeadlessSelectFileDialogFactory()));
}
// static
void HeadlessSelectFileDialogFactory::SetSelectFileDialogOnceCallbackForTests(
SelectFileDialogCallback callback) {
DCHECK(instance_);
instance_->callback_ = std::move(callback);
}
ui::SelectFileDialog* HeadlessSelectFileDialogFactory::Create(
ui::SelectFileDialog::Listener* listener,
std::unique_ptr<ui::SelectFilePolicy> policy) {
return new HeadlessSelectFileDialog(listener, std::move(policy),
std::move(callback_));
}
HeadlessSelectFileDialogFactory::HeadlessSelectFileDialogFactory() {
DCHECK(!instance_);
instance_ = this;
}
HeadlessSelectFileDialogFactory::~HeadlessSelectFileDialogFactory() {
DCHECK_EQ(instance_, this);
instance_ = nullptr;
}
} // namespace headless
|