blob: 45c0a2a49e033211b58ab44698579c303d38b52b [file]
// Copyright 2017 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/test/permissions/permission_request_manager_test_api.h"
#include <memory>
#include "base/functional/bind.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h"
#include "chrome/browser/ui/views/permissions/permission_prompt_desktop.h"
#include "components/permissions/permission_request.h"
#include "ui/views/widget/widget.h"
namespace test {
namespace {
// Wraps a PermissionRequest so that it can pass a closure to itself to the
// PermissionRequest constructor. Without this wrapper, there's no way to
// handle all destruction paths.
class TestPermissionRequestOwner {
public:
explicit TestPermissionRequestOwner(permissions::RequestType type) {
const bool user_gesture = true;
auto decided = [](ContentSetting, bool, bool) {};
request_ = std::make_unique<permissions::PermissionRequest>(
GURL("https://example.com"), type, user_gesture,
base::BindRepeating(decided),
base::BindOnce(&TestPermissionRequestOwner::DeleteThis,
base::Unretained(this)));
}
TestPermissionRequestOwner(const TestPermissionRequestOwner&) = delete;
TestPermissionRequestOwner& operator=(const TestPermissionRequestOwner&) =
delete;
permissions::PermissionRequest* request() { return request_.get(); }
private:
void DeleteThis() { delete this; }
std::unique_ptr<permissions::PermissionRequest> request_;
};
} // namespace
PermissionRequestManagerTestApi::PermissionRequestManagerTestApi(
permissions::PermissionRequestManager* manager)
: manager_(manager) {}
PermissionRequestManagerTestApi::PermissionRequestManagerTestApi(
Browser* browser)
: PermissionRequestManagerTestApi(
permissions::PermissionRequestManager::FromWebContents(
browser->tab_strip_model()->GetActiveWebContents())) {}
void PermissionRequestManagerTestApi::AddSimpleRequest(
content::RenderFrameHost* source_frame,
permissions::RequestType type) {
TestPermissionRequestOwner* request_owner =
new TestPermissionRequestOwner(type);
manager_->AddRequest(source_frame, request_owner->request());
}
views::Widget* PermissionRequestManagerTestApi::GetPromptWindow() {
PermissionPromptDesktop* prompt =
static_cast<PermissionPromptDesktop*>(manager_->view_.get());
return prompt ? prompt->GetPromptBubbleWidgetForTesting() : nullptr;
}
void PermissionRequestManagerTestApi::SimulateWebContentsDestroyed() {
manager_->WebContentsDestroyed();
}
} // namespace test