blob: 6567b2fee60f9fc08654a4934a259ee14cd7c58a [file] [log] [blame]
// 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 "chrome/browser/ash/printing/oauth2/signin_dialog.h"
#include <memory>
#include <string>
#include <utility>
#include "base/strings/string_util.h"
#include "chrome/browser/ash/printing/oauth2/constants.h"
#include "chrome/browser/ash/printing/oauth2/status_code.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/mojom/dialog_button.mojom.h"
#include "ui/base/mojom/ui_base_types.mojom-shared.h"
#include "ui/views/controls/webview/webview.h"
#include "ui/views/layout/fill_layout.h"
#include "url/gurl.h"
namespace ash::printing::oauth2 {
SigninDialog::SigninDialog(content::BrowserContext* browser_context)
: web_view_(
AddChildView(std::make_unique<views::WebView>(browser_context))) {
SetHasWindowSizeControls(true);
SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone));
set_use_custom_frame(false);
SetUseDefaultFillLayout(true);
web_modal::WebContentsModalDialogManager::CreateForWebContents(
web_view_->GetWebContents());
web_modal::WebContentsModalDialogManager::FromWebContents(
web_view_->GetWebContents())
->SetDelegate(this);
Observe(web_view_->GetWebContents());
}
SigninDialog::~SigninDialog() {
if (callback_) {
std::move(callback_).Run(StatusCode::kUnexpectedError,
"authorization dialog was closed");
}
}
void SigninDialog::StartAuthorizationProcedure(const GURL& auth_url,
StatusCallback callback) {
callback_ = std::move(callback);
const std::string title = auth_url.GetWithEmptyPath().spec();
SetTitle(std::u16string(title.begin(), title.end()));
web_view_->LoadInitialURL(auth_url);
GetWidget()->Show();
}
web_modal::WebContentsModalDialogHost*
SigninDialog::GetWebContentsModalDialogHost(
content::WebContents* web_contents) {
return this;
}
gfx::NativeView SigninDialog::GetHostView() const {
return GetWidget()->GetNativeView();
}
gfx::Point SigninDialog::GetDialogPosition(const gfx::Size& size) {
gfx::Size widget_size = GetWidget()->GetWindowBoundsInScreen().size();
return gfx::Point(std::max(0, (widget_size.width() - size.width()) / 2),
std::max(0, (widget_size.height() - size.height()) / 2));
}
gfx::Size SigninDialog::GetMaximumDialogSize() {
return GetWidget()->GetWindowBoundsInScreen().size();
}
void SigninDialog::AddObserver(web_modal::ModalDialogHostObserver* observer) {}
void SigninDialog::RemoveObserver(
web_modal::ModalDialogHostObserver* observer) {}
// views::DialogDelegate:
gfx::Size SigninDialog::CalculatePreferredSize(
const views::SizeBounds& available_size) const {
// TODO(https://crbug.com/1223535): need to tweak this.
// Or remove this whole class if not needed anymore.
return gfx::Size(800, 640);
}
ui::mojom::ModalType SigninDialog::GetModalType() const {
return ui::mojom::ModalType::kWindow;
}
views::View* SigninDialog::GetInitiallyFocusedView() {
return web_view_.get();
}
void SigninDialog::DidRedirectNavigation(
content::NavigationHandle* navigation_handle) {
const GURL& url = navigation_handle->GetURL();
// Check if the URL is a redirectURI marking the end of the process.
if (base::StartsWith(url.possibly_invalid_spec(), kRedirectURI)) {
GetWidget()->Close();
std::move(callback_).Run(StatusCode::kOK, url.spec());
}
}
BEGIN_METADATA(SigninDialog)
END_METADATA
} // namespace ash::printing::oauth2