blob: 89b31bba3fef1dbb472173ef00d406f0392707e8 [file] [log] [blame]
// Copyright 2023 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/usb/usb_browser_test_utils.h"
#include "chrome/browser/usb/usb_chooser_controller.h"
#include "chrome/browser/usb/web_usb_chooser.h"
#include "components/permissions/chooser_controller.h"
#include "content/public/common/content_client.h"
namespace {
class FakeChooserView : public permissions::ChooserController::View {
public:
explicit FakeChooserView(
std::unique_ptr<permissions::ChooserController> controller)
: controller_(std::move(controller)) {
controller_->set_view(this);
}
FakeChooserView(const FakeChooserView&) = delete;
FakeChooserView& operator=(const FakeChooserView&) = delete;
~FakeChooserView() override { controller_->set_view(nullptr); }
void OnOptionsInitialized() override {
if (controller_->NumOptions()) {
controller_->Select({0});
} else {
controller_->Cancel();
}
delete this;
}
void OnOptionAdded(size_t index) override { NOTREACHED(); }
void OnOptionRemoved(size_t index) override { NOTREACHED(); }
void OnOptionUpdated(size_t index) override { NOTREACHED(); }
void OnAdapterEnabledChanged(bool enabled) override { NOTREACHED(); }
void OnRefreshStateChanged(bool refreshing) override { NOTREACHED(); }
private:
std::unique_ptr<permissions::ChooserController> controller_;
};
class FakeUsbChooser : public WebUsbChooser {
public:
FakeUsbChooser() = default;
FakeUsbChooser(const FakeUsbChooser&) = delete;
FakeUsbChooser& operator=(const FakeUsbChooser&) = delete;
~FakeUsbChooser() override = default;
void ShowChooser(content::RenderFrameHost* frame,
std::unique_ptr<UsbChooserController> controller) override {
// Device list initialization in UsbChooserController may complete before
// having a valid view in which case OnOptionsInitialized() has no chance to
// be triggered, so select the first option directly if options are ready.
if (controller->NumOptions()) {
controller->Select({0});
} else {
new FakeChooserView(std::move(controller));
}
}
};
} // namespace
TestUsbDelegate::TestUsbDelegate() = default;
TestUsbDelegate::~TestUsbDelegate() = default;
std::unique_ptr<content::UsbChooser> TestUsbDelegate::RunChooser(
content::RenderFrameHost& frame,
blink::mojom::WebUsbRequestDeviceOptionsPtr options,
blink::mojom::WebUsbService::GetPermissionCallback callback) {
if (use_fake_chooser_) {
auto chooser = std::make_unique<FakeUsbChooser>();
chooser->ShowChooser(&frame,
std::make_unique<UsbChooserController>(
&frame, std::move(options), std::move(callback)));
return chooser;
} else {
return ChromeUsbDelegate::RunChooser(frame, std::move(options),
std::move(callback));
}
}
TestUsbContentBrowserClient::TestUsbContentBrowserClient()
: usb_delegate_(std::make_unique<TestUsbDelegate>()) {}
TestUsbContentBrowserClient::~TestUsbContentBrowserClient() = default;
content::UsbDelegate* TestUsbContentBrowserClient::GetUsbDelegate() {
return usb_delegate_.get();
}
void TestUsbContentBrowserClient::SetAsBrowserClient() {
original_content_browser_client_ = content::SetBrowserClientForTesting(this);
}
void TestUsbContentBrowserClient::UnsetAsBrowserClient() {
content::SetBrowserClientForTesting(original_content_browser_client_);
usb_delegate_.reset();
}