File indexing completed on 2024-06-02 05:04:55

0001 /*
0002     This file is part of the KDE project.
0003 
0004     SPDX-FileCopyrightText: 2009 Dawit Alemayehu <adawit @ kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "passwordbar.h"
0010 
0011 #include "settings/webenginesettings.h"
0012 
0013 #include <KColorScheme>
0014 #include <KLocalizedString>
0015 
0016 #include <QCoreApplication>
0017 #include <QAction>
0018 #include <QPalette>
0019 #include <QToolButton>
0020 #include <QTimer>
0021 
0022 #include <algorithm>
0023 
0024 PasswordBar::PasswordBar(QWidget *parent) :KMessageWidget(parent), m_detailsVisible(false), m_detailsWidget(new CredentialsDetailsWidget(parent))
0025 {
0026     setCloseButtonVisible(false);
0027     setMessageType(KMessageWidget::Information);
0028 
0029     QAction* action = new QAction(i18nc("@action:remember password", "&Remember"), this);
0030     connect(action, &QAction::triggered, this, &PasswordBar::onRememberButtonClicked);
0031     addAction(action);
0032 
0033     action = new QAction(i18nc("@action:never for this site", "Ne&ver for this site"), this);
0034     connect(action, &QAction::triggered, this, &PasswordBar::onNeverButtonClicked);
0035     addAction(action);
0036 
0037     action = new QAction(i18nc("@action:not now", "N&ot now"), this);
0038     connect(action, &QAction::triggered, this, &PasswordBar::onNotNowButtonClicked);
0039     addAction(action);
0040 
0041     m_detailsAction = new QAction(i18nc("@action:display details about credentials to store", "&Show details"), this);
0042     m_detailsAction->setObjectName("detailsAction");
0043     connect(m_detailsAction, &QAction::triggered, this, &PasswordBar::onDetailsButtonClicked);
0044     addAction(m_detailsAction);
0045 }
0046 
0047 PasswordBar::~PasswordBar()
0048 {
0049     if (m_detailsWidget) {
0050         m_detailsWidget->deleteLater();
0051     }
0052 }
0053 
0054 QUrl PasswordBar::url() const
0055 {
0056     return m_url;
0057 }
0058 
0059 QString PasswordBar::requestKey() const
0060 {
0061     return m_requestKey;
0062 }
0063 
0064 void PasswordBar::setUrl (const QUrl& url)
0065 {
0066     m_url = url;
0067 }
0068 
0069 void PasswordBar::setRequestKey (const QString& key)
0070 {
0071     m_requestKey = key;
0072 }
0073 
0074 void PasswordBar::onNotNowButtonClicked()
0075 {
0076     animatedHide();
0077     emit saveFormDataRejected (m_requestKey);
0078     emit done();
0079     clear();
0080 }
0081 
0082 void PasswordBar::onNeverButtonClicked()
0083 {
0084     WebEngineSettings::self()->addNonPasswordStorableSite(m_url.host());
0085     onNotNowButtonClicked();
0086 }
0087 
0088 void PasswordBar::onRememberButtonClicked()
0089 {
0090     animatedHide();
0091     emit saveFormDataAccepted(m_requestKey);
0092     emit done();
0093     clear();
0094 }
0095 
0096 void PasswordBar::clear()
0097 {
0098     m_requestKey.clear();
0099     m_url.clear();
0100     if (m_detailsWidget) {
0101         m_detailsWidget->clear();
0102         setDetailsWidgetVisibility(false);
0103     }
0104 }
0105 
0106 void PasswordBar::resizeEvent(QResizeEvent* event)
0107 {
0108     KMessageWidget::resizeEvent(event);
0109     if (m_detailsVisible && m_detailsWidget) {
0110         m_detailsWidget->move(computeDetailsWidgetPosition());
0111     }
0112 }
0113 
0114 void PasswordBar::onDetailsButtonClicked()
0115 {
0116     setDetailsWidgetVisibility(!m_detailsVisible);
0117 }
0118 
0119 void PasswordBar::setDetailsWidgetVisibility(bool visible)
0120 {
0121     m_detailsVisible = visible;
0122     if (m_detailsVisible) {
0123         m_detailsAction->setText(i18nc("@action:hide details about credentials to store", "&Hide details"));
0124     } else {
0125         m_detailsAction->setText(i18nc("@action:display details about credentials to store", "&Show details"));
0126     }
0127     if (m_detailsWidget) {
0128         m_detailsWidget->setVisible(m_detailsVisible);
0129         if (m_detailsVisible) {
0130             m_detailsWidget->resize(m_detailsWidget->sizeHint());
0131             m_detailsWidget->move(computeDetailsWidgetPosition());
0132         }
0133     }
0134 }
0135 
0136 void PasswordBar::setForms(const WebEngineWallet::WebFormList& forms)
0137 {
0138     if (m_detailsWidget) {
0139         m_detailsWidget->setForms(forms);
0140     }
0141 }
0142 
0143 QPoint PasswordBar::computeDetailsWidgetPosition() const
0144 {
0145     if (!m_detailsWidget) {
0146         return QPoint();
0147     }
0148     return mapTo(parentWidget(), QPoint{width() - m_detailsWidget->width(), height()});
0149 }