blob: dd54345e62248702923ca976052dbaf04c301f26 [file] [log] [blame]
// Copyright 2021 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/webui/access_code_cast/access_code_cast_ui.h"
#include "base/containers/span.h"
#include "base/json/json_writer.h"
#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/media_router/media_cast_mode.h"
#include "chrome/browser/ui/webui/webui_util.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/access_code_cast_resources.h"
#include "chrome/grit/access_code_cast_resources_map.h"
#include "chrome/grit/generated_resources.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/common/bindings_policy.h"
#include "ui/base/webui/web_ui_util.h"
///////////////////////////////////////////////////////////////////////////////
// AccessCodeCast dialog:
///////////////////////////////////////////////////////////////////////////////
AccessCodeCastDialog::AccessCodeCastDialog(
media_router::MediaCastMode cast_mode)
: cast_mode_(cast_mode) {
set_can_resize(false);
}
void AccessCodeCastDialog::Show(media_router::MediaCastMode mode) {
Profile* profile = ProfileManager::GetActiveUserProfile();
AccessCodeCastDialog* dialog = new AccessCodeCastDialog(mode);
chrome::ShowWebDialog(nullptr, profile, dialog);
}
ui::ModalType AccessCodeCastDialog::GetDialogModalType() const {
return ui::MODAL_TYPE_NONE;
}
std::u16string AccessCodeCastDialog::GetDialogTitle() const {
return std::u16string();
}
GURL AccessCodeCastDialog::GetDialogContentURL() const {
return GURL(chrome::kChromeUIAccessCodeCastURL);
}
void AccessCodeCastDialog::GetWebUIMessageHandlers(
std::vector<content::WebUIMessageHandler*>* handlers) const {}
void AccessCodeCastDialog::GetDialogSize(gfx::Size* size) const {
// TODO(b/202529859): Replace these with final values
const int kDefaultWidth = 512;
const int kDefaultHeight = 480;
size->SetSize(kDefaultWidth, kDefaultHeight);
}
std::string AccessCodeCastDialog::GetDialogArgs() const {
base::DictionaryValue args;
args.SetKey("castMode", base::Value(cast_mode_));
std::string json;
base::JSONWriter::Write(args, &json);
return json;
}
void AccessCodeCastDialog::OnDialogShown(content::WebUI* webui) {
webui_ = webui;
}
void AccessCodeCastDialog::OnDialogClosed(const std::string& json_retval) {}
void AccessCodeCastDialog::OnCloseContents(content::WebContents* source,
bool* out_close_dialog) {
*out_close_dialog = true;
}
bool AccessCodeCastDialog::ShouldShowDialogTitle() const {
return false;
}
bool AccessCodeCastDialog::ShouldShowCloseButton() const {
return false;
}
AccessCodeCastDialog::FrameKind
AccessCodeCastDialog::GetWebDialogFrameKind() const {
return FrameKind::kDialog;
}
// Ensure the WebUI dialog has camera access
void AccessCodeCastDialog::RequestMediaAccessPermission(
content::WebContents* web_contents,
const content::MediaStreamRequest& request,
content::MediaResponseCallback callback) {
MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
web_contents, request, std::move(callback), nullptr /* extension */);
}
bool AccessCodeCastDialog::CheckMediaAccessPermission(
content::RenderFrameHost* render_frame_host,
const GURL& security_origin,
blink::mojom::MediaStreamType type) {
return true;
}
AccessCodeCastDialog::~AccessCodeCastDialog() = default;
///////////////////////////////////////////////////////////////////////////////
// AccessCodeCast UI controller:
///////////////////////////////////////////////////////////////////////////////
AccessCodeCastUI::AccessCodeCastUI(content::WebUI* web_ui)
: MojoWebDialogUI(web_ui) {
auto source = base::WrapUnique(
content::WebUIDataSource::Create(chrome::kChromeUIAccessCodeCastHost));
webui::SetupWebUIDataSource(
source.get(),
base::make_span(kAccessCodeCastResources, kAccessCodeCastResourcesSize),
IDR_ACCESS_CODE_CAST_INDEX_HTML);
static constexpr webui::LocalizedString kStrings[] = {
{"back", IDS_ACCESS_CODE_CAST_BACK},
{"cast", IDS_ACCESS_CODE_CAST_CAST},
{"close", IDS_CLOSE},
{"dialogTitle", IDS_ACCESS_CODE_CAST_DIALOG_TITLE},
{"errorAccessCode", IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE},
{"errorNetwork", IDS_ACCESS_CODE_CAST_ERROR_NETWORK},
{"errorPermission", IDS_ACCESS_CODE_CAST_ERROR_PERMISSION},
{"errorTooManyRequests", IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS},
{"errorUnknown", IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN},
{"useCamera", IDS_ACCESS_CODE_CAST_USE_CAMERA},
};
source->AddLocalizedStrings(kStrings);
content::BrowserContext* browser_context =
web_ui->GetWebContents()->GetBrowserContext();
content::WebUIDataSource::Add(browser_context, source.release());
}
AccessCodeCastUI::~AccessCodeCastUI() = default;
void AccessCodeCastUI::BindInterface(
mojo::PendingReceiver<access_code_cast::mojom::PageHandlerFactory>
receiver) {
factory_receiver_.reset();
factory_receiver_.Bind(std::move(receiver));
}
void AccessCodeCastUI::CreatePageHandler(
mojo::PendingRemote<access_code_cast::mojom::Page> page,
mojo::PendingReceiver<access_code_cast::mojom::PageHandler> receiver) {
DCHECK(page);
page_handler_ = std::make_unique<AccessCodeCastHandler>(
std::move(receiver), std::move(page), Profile::FromWebUI(web_ui()));
}
WEB_UI_CONTROLLER_TYPE_IMPL(AccessCodeCastUI)