12#include <QWebEngineProfile>
13#include <QWebEngineHistory>
14#include <QWebEngineSettings>
15#include <QWebEngineFindTextResult>
16#include <QRegularExpression>
17#include <QWebEngineCookieStore>
18#include <QStandardPaths>
20#include <QApplication>
21#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
22 #include <QWebEngineProfileBuilder>
24#include <QLoggingCategory>
25#include "RabbitCommonDir.h"
26#include "RabbitCommonTools.h"
27#include "FrmWebBrowser.h"
30static Q_LOGGING_CATEGORY(log,
"WebBrowser.Browser")
41 , m_pFindNext(
nullptr)
42 , m_pFindPrevious(
nullptr)
43 , m_pZoomOriginal(
nullptr)
46 , m_pFavAction(
nullptr)
49 , m_pAddPageIncognito(
nullptr)
50 , m_pAddWindow(
nullptr)
52 , m_pPrintToPdf(
nullptr)
53 , m_pAddWindowIncognito(
nullptr)
54 , m_pDownload(
nullptr)
55 , m_pInspector(
nullptr)
57 , m_pUrlLineEdit(
nullptr)
58 , m_pProgressBar(
nullptr)
60 , m_DownloadManager(pPara)
62 qDebug(log) << Q_FUNC_INFO;
65 setWindowIcon(QIcon::fromTheme(
"web-browser"));
67 QVBoxLayout* pLayout =
new QVBoxLayout(
this);
71 pLayout->setSpacing(0);
72 pLayout->setContentsMargins(0, 0, 0, 0);
75 m_pToolBar =
new QToolBar(
this);
77 pLayout->addWidget(m_pToolBar);
80 m_pBack = m_pToolBar->addAction(
81 QIcon::fromTheme(
"go-previous"), tr(
"Back"),
84 if(pWeb && pWeb->page())
85 pWeb->page()->action(QWebEnginePage::Back)->trigger();
87 m_pBack->setEnabled(
false);
88 m_pBack->setShortcuts(QKeySequence::Back);
89 m_pBack->setStatusTip(m_pBack->text());
90 m_pForward = m_pToolBar->addAction(
91 QIcon::fromTheme(
"go-next"), tr(
"Forward"),
94 if(pWeb && pWeb->page())
95 pWeb->page()->action(QWebEnginePage::Forward)->trigger();
97 m_pForward->setEnabled(
false);
98 m_pForward->setShortcuts(QKeySequence::Forward);
99 m_pForward->setStatusTip(m_pForward->text());
100 m_pRefresh = m_pToolBar->addAction(
101 QIcon::fromTheme(
"view-refresh"), tr(
"Refresh"),
104 if(pWeb && pWeb->page())
105 pWeb->page()->action(QWebEnginePage::Reload)->trigger();
107 m_pRefresh->setShortcuts(QKeySequence::Refresh);
108 m_pRefresh->setStatusTip(m_pRefresh->text());
110 m_pUrlLineEdit =
new QLineEdit(
this);
111 m_pFavAction =
new QAction(m_pUrlLineEdit);
112 m_pUrlLineEdit->addAction(m_pFavAction, QLineEdit::LeadingPosition);
113 m_pUrlLineEdit->setClearButtonEnabled(
true);
114 m_pUrl = m_pToolBar->addWidget(m_pUrlLineEdit);
115 check = connect(m_pUrlLineEdit, &QLineEdit::returnPressed,
116 this, &CFrmWebBrowser::slotReturnPressed);
118 check = connect(m_pUrlLineEdit, &QLineEdit::editingFinished,
119 this, &CFrmWebBrowser::slotReturnPressed);
121 m_pGo =
new QAction(QIcon::fromTheme(
"go-next"), tr(
"go"), m_pUrlLineEdit);
122 m_pGo->setStatusTip(m_pGo->text());
123 check = connect(m_pGo, &QAction::triggered,
this, &CFrmWebBrowser::slotReturnPressed);
125 m_pUrlLineEdit->addAction(m_pGo, QLineEdit::TrailingPosition);
126 m_pGo->setVisible(
false);
127 check = connect(m_pUrlLineEdit, &QLineEdit::textEdited,
128 this, [&](
const QString &text){
129 QLineEdit* pLineEdit = qobject_cast<QLineEdit*>(sender());
132 if(m_pGo->isVisible())
133 m_pGo->setVisible(
false);
135 if(!m_pGo->isVisible())
136 m_pGo->setVisible(
true);
142 m_pAddPage = m_pToolBar->addAction(QIcon::fromTheme(
"add"), tr(
"Add tab page"),
144 CreateWindow(QWebEnginePage::WebBrowserTab);
145 if(!m_pPara->GetTabUrl().isEmpty()) {
146 m_pUrlLineEdit->setText(m_pPara->GetTabUrl());
150 m_pAddPage->setStatusTip(m_pAddPage->text());
151 m_pAddPage->setShortcuts(QKeySequence::AddTab);
153 m_pDownload = m_pToolBar->addAction(
154 QIcon::fromTheme(
"emblem-downloads"), tr(
"Download Manager"));
155 m_pDownload->setCheckable(
true);
156 m_pDownload->setStatusTip(m_pDownload->text());
157 m_pDownload->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_D));
158 check = connect(m_pDownload, &QAction::toggled,
159 this, [&](
bool checked){
161 m_DownloadManager.show();
163 m_DownloadManager.hide();
166 check = connect(&m_DownloadManager, &CFrmDownloadManager::sigVisible,
this,
169 m_pDownload->setChecked(visible);
173 m_pProgressBar =
new QProgressBar(
this);
175 pLayout->addWidget(m_pProgressBar);
176 m_pProgressBar->setMaximumHeight(1);
177 m_pProgressBar->setTextVisible(
false);
178 m_pProgressBar->show();
179 m_pProgressBar->setStyleSheet(
"QProgressBar {border: 0px} QProgressBar::chunk {background-color: #da4453}");
182 m_pTab =
new QTabWidget(
this);
184 m_pTab->setTabsClosable(
true);
185 m_pTab->setUsesScrollButtons(
true);
186 m_pTab->setMovable(
true);
187 m_pTab->setElideMode(Qt::TextElideMode::ElideRight);
188 pLayout->addWidget(m_pTab);
190 check = connect(m_pTab, &QTabWidget::currentChanged,
191 this, &CFrmWebBrowser::slotTabCurrentChanged);
193 check = connect(m_pTab, &QTabWidget::tabCloseRequested,
194 this, &CFrmWebBrowser::slotTabCloseRequested);
197 m_DownloadManager.hide();
198 QWebEngineProfile::defaultProfile()->setDownloadPath(m_pPara->GetDownloadFolder());
199 check = connect(QWebEngineProfile::defaultProfile(), &QWebEngineProfile::downloadRequested,
200 &m_DownloadManager, &CFrmDownloadManager::slotDownloadRequested);
202 check = connect(m_pPara, &CParameterWebBrowser::sigDownloadFolderChanged,
204 QWebEngineProfile::defaultProfile()->setDownloadPath(m_pPara->GetDownloadFolder());
206 m_profile->setDownloadPath(m_pPara->GetDownloadFolder());
213 m_pMenuBar =
new QMenuBar(
this);
215 m_Menu.setTitle(tr(
"Operate"));
216 m_pMenuBar->addMenu(&m_Menu);
217 pLayout->setMenuBar(m_pMenuBar);
222CFrmWebBrowser::~CFrmWebBrowser()
224 qDebug(log) << Q_FUNC_INFO;
226 m_pToolBar->deleteLater();
227 m_pToolBar =
nullptr;
230 m_pTab->deleteLater();
234 if(m_pPara->GetClearCookie() && m_profile)
235 m_profile->cookieStore()->deleteAllCookies();
236 if(m_pPara->GetClearHttpCache() && m_profile)
237 m_profile->clearHttpCache();
240QMenu* CFrmWebBrowser::GetMenu(QWidget *parent)
242 if(m_Menu.actions().isEmpty())
247QWebEngineView* CFrmWebBrowser::CreateWindow(
248 QWebEnginePage::WebWindowType type,
bool offTheRecord)
250 qDebug(log) <<
"Create window:" << type;
254 case QWebEnginePage::WebBrowserTab: {
255 auto pTab = CreateTab(&pView, offTheRecord);
256 int index = m_pTab->addTab(pTab, pView->favIcon(), tr(
"New page"));
258 m_pTab->setCurrentIndex(index);
261 case QWebEnginePage::WebBrowserBackgroundTab: {
262 auto pTab = CreateTab(&pView, offTheRecord);
263 int index = m_pTab->currentIndex();
264 m_pTab->addTab(pTab, pView->favIcon(), tr(
"New page"));
265 if(-1 < index && index != m_pTab->currentIndex())
266 m_pTab->setCurrentIndex(index);
269 case QWebEnginePage::WebBrowserWindow: {
272 pView = qobject_cast<CFrmWebView*>(
273 pWin->CreateWindow(QWebEnginePage::WebBrowserTab));
274 pWin->setAttribute(Qt::WA_DeleteOnClose);
275 auto pMainWin = RabbitCommon::CTools::GetMainWindow();
277 pWin->resize(pMainWin->frameGeometry().width(),
278 pMainWin->frameGeometry().height());
283 case QWebEnginePage::WebDialog: {
285 auto popup =
new CFrmPopup(GetProfile(offTheRecord),
this);
286 pView = popup->GetView();
297 check = connect(pWeb, &CFrmWebView::sigDevToolsRequested,
300 m_pInspector->setChecked(
true);
303 check = connect(pWeb, &CFrmWebView::sigWebActionEnabledChanged,
304 this, [
this, pWeb](QWebEnginePage::WebAction webAction,
bool enabled){
305 if(!IsCurrentView(pWeb))
return;
307 case QWebEnginePage::WebAction::Back:
308 m_pBack->setEnabled(enabled);
310 case QWebEnginePage::WebAction::Forward:
311 m_pForward->setEnabled(enabled);
313 case QWebEnginePage::WebAction::Reload: {
314 m_pRefresh->setEnabled(enabled);
315 if(m_pRefresh->isEnabled())
316 m_pToolBar->insertAction(m_pUrl, m_pRefresh);
318 m_pToolBar->removeAction(m_pRefresh);
321 case QWebEnginePage::WebAction::Stop: {
322 m_pStop->setEnabled(enabled);
323 if(m_pStop->isEnabled())
324 m_pToolBar->insertAction(m_pUrl, m_pStop);
326 m_pToolBar->removeAction(m_pStop);
333 check = connect(pWeb, &QWebEngineView::urlChanged,
334 this, [&](
const QUrl &url){
335 CFrmWebView* pWeb = qobject_cast<CFrmWebView*>(sender());
336 if(IsCurrentView(pWeb))
337 m_pUrlLineEdit->setText(url.toString());
340 check = connect(pWeb, &CFrmWebView::titleChanged,
341 this, [&](
const QString &title) {
342 CFrmWebView* pWeb = qobject_cast<CFrmWebView*>(sender());
343 int index = IndexOfTab(pWeb);
345 m_pTab->setTabText(index, title);
346 setWindowTitle(title);
351 check = connect(pWeb, &CFrmWebView::favIconChanged,
352 this, [&](
const QIcon &icon){
353 CFrmWebView* pWeb = qobject_cast<CFrmWebView*>(sender());
354 int index = IndexOfTab(pWeb);
356 m_pTab->setTabIcon(index, icon);
362 check = connect(pWeb, &CFrmWebView::sigLinkHovered,
363 this, &CFrmWebBrowser::sigInformation);
365 check = connect(pWeb, &CFrmWebView::sigCloseRequested,
366 this, &CFrmWebBrowser::slotViewCloseRequested);
368 check = connect(pWeb, &CFrmWebView::loadProgress,
369 this, [&](
int progress){
370 CFrmWebView* pWeb = qobject_cast<CFrmWebView*>(sender());
371 if(IsCurrentView(pWeb))
372 m_pProgressBar->setValue(progress);
375 m_pProgressBar->setValue(pWeb->progress());
376#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
377 check = connect(pWeb, &CFrmWebView::printFinished,
378 this, &CFrmWebBrowser::slotPrintFinished);
380 check = connect(pWeb, &CFrmWebView::pdfPrintingFinished,
381 this, &CFrmWebBrowser::slotPdfPrintingFinished);
386QWebEngineProfile* CFrmWebBrowser::GetProfile(
bool offTheRecord)
389 return QWebEngineProfile::defaultProfile();
391 return m_profile.get();
393 QSettings set(RabbitCommon::CDir::Instance()->GetDirUserData()
394 + QDir::separator() +
"WebBrowser.ini",
395 QSettings::IniFormat);
396 QString name =
"io.github.KangLin.RabbitRemoteControl";
397#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
398 name += QLatin1StringView(qWebEngineChromiumVersion());
399 name = set.value(
"Profile/Name", name).toString();
400 QWebEngineProfileBuilder profileBuilder;
401 m_profile.reset(profileBuilder.createProfile(name));
403 name = set.value(
"Profile/Name", name).toString();
404 m_profile.reset(
new QWebEngineProfile(name));
407 return QWebEngineProfile::defaultProfile();
409 set.setValue(
"Profile/Name", name);
411 m_profile->settings()->setAttribute(QWebEngineSettings::PluginsEnabled,
true);
412 m_profile->settings()->setAttribute(QWebEngineSettings::DnsPrefetchEnabled,
true);
413 m_profile->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls,
true);
414 m_profile->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls,
false);
415#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
416 m_profile->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled,
true);
418#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
419 m_profile->settings()->setAttribute(QWebEngineSettings::ScreenCaptureEnabled,
true);
421#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)
422 m_profile->settings()->setAttribute(QWebEngineSettings::AllowRunningInsecureContent,
true);
424#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
425 m_profile->settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture,
false);
427 m_profile->setDownloadPath(m_pPara->GetDownloadFolder());
428 bool check = connect(m_profile.get(), &QWebEngineProfile::downloadRequested,
429 &m_DownloadManager, &CFrmDownloadManager::slotDownloadRequested);
431 qDebug(log) <<
"User agent:" << m_profile->httpUserAgent()
432 <<
"Persistent path:" << m_profile->persistentStoragePath()
433 <<
"Cache path:" << m_profile->cachePath()
434 <<
"Storage name:" << m_profile->storageName()
435 <<
"Cookie:" << m_profile->cookieStore()
436 <<
"Is off the Record:" << m_profile->isOffTheRecord()
437 <<
"Download:" << m_profile->downloadPath();
438 return m_profile.get();
441CFrmWebView *CFrmWebBrowser::CreateWebView(
bool offTheRecord)
445 auto profile = GetProfile(offTheRecord);
449 auto page =
new QWebEnginePage(profile, pView);
450 pView->setPage(page);
455QWidget* CFrmWebBrowser::CreateTab(
CFrmWebView **view,
bool offTheRecord)
457 QSplitter *pSplitter =
new QSplitter(Qt::Vertical,
this);
459 pSplitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
466 pWeb = CreateWebView(offTheRecord);
470 pWeb = CreateWebView(offTheRecord);
473 pSplitter->addWidget(pWeb);
480CFrmWebView *CFrmWebBrowser::CurrentView(ViewType type)
482 auto w = m_pTab->currentWidget();
483 if(!w)
return nullptr;
484 QSplitter *pSplitter = qobject_cast<QSplitter*>(w);
485 if(!pSplitter)
return nullptr;
486 int index = (int)type;
487 if(0 > index && pSplitter->count() <= index)
return nullptr;
488 return qobject_cast<CFrmWebView*>(pSplitter->widget(index));
491CFrmWebView* CFrmWebBrowser::GetView(
int index, ViewType type)
493 if(0 > index || m_pTab->count() <= index)
return nullptr;
494 auto w = m_pTab->widget(index);
495 if(!w)
return nullptr;
496 QSplitter *pSplitter = qobject_cast<QSplitter*>(w);
497 if(!pSplitter)
return nullptr;
499 if(0 > idx && pSplitter->count() <= idx)
return nullptr;
500 return qobject_cast<CFrmWebView*>(pSplitter->widget(idx));
503bool CFrmWebBrowser::IsCurrentView(
CFrmWebView *pView)
505 auto w = m_pTab->currentWidget();
507 QSplitter *pSplitter = qobject_cast<QSplitter*>(w);
508 if(!pSplitter)
return false;
509 return -1 != pSplitter->indexOf(pView);
515 if(!pView)
return nRet;
516 QWidget* p = qobject_cast<QWidget*>(pView->parent());
518 nRet = m_pTab->indexOf(p);
522int CFrmWebBrowser::InitMenu(QMenu *pMenu)
526 pMenu->addAction(m_pBack);
527 pMenu->addAction(m_pForward);
528 pMenu->addAction(m_pRefresh);
529 m_pStop = pMenu->addAction(
530 QIcon::fromTheme(
"media-playback-stop"), tr(
"Stop"),
this, [&](){
532 if(pWeb && pWeb->page())
533 pWeb->page()->action(QWebEnginePage::Stop)->trigger();
535 m_pStop->setEnabled(
false);
536 m_pStop->setShortcuts(QKeySequence::Cancel);
537 m_pStop->setStatusTip(m_pStop->text());
539 pMenu->addSeparator();
540 pMenu->addAction(m_pAddPage);
541 m_pAddPageIncognito = pMenu->addAction(
542 QIcon::fromTheme(
"add"), tr(
"Add incognito tab"),
544 CreateWindow(QWebEnginePage::WebBrowserTab,
true);
545 if(!m_pPara->GetTabUrl().isEmpty()) {
546 m_pUrlLineEdit->setText(m_pPara->GetTabUrl());
550 m_pAddPageIncognito->setStatusTip(m_pAddPageIncognito->text());
551 m_pAddWindow = pMenu->addAction(
552 QIcon::fromTheme(
"add"), tr(
"Add window"),
554 CreateWindow(QWebEnginePage::WebBrowserWindow);
556 m_pAddWindow->setVisible(
false);
557 m_pAddWindow->setStatusTip(m_pAddWindow->text());
558 m_pAddWindowIncognito = pMenu->addAction(
559 QIcon::fromTheme(
"add"), tr(
"Add Incognito Window"),
561 CreateWindow(QWebEnginePage::WebBrowserWindow,
true);
563 m_pAddWindowIncognito->setVisible(
false);
564 m_pAddWindowIncognito->setStatusTip(m_pAddWindowIncognito->text());
566 pMenu->addSeparator();
567 m_pFind = pMenu->addAction(
568 QIcon::fromTheme(
"edit-find"), tr(
"&Find"),
this,
573 if(pWeb->selectedText().isEmpty()) {
574 if(QApplication::clipboard()
575 && !QApplication::clipboard()->text().isEmpty())
576 m_szFindText = QApplication::clipboard()->text();
578 m_szFindText = pWeb->selectedText();
580 QString search = QInputDialog::getText(
582 tr(
"Find:"), QLineEdit::Normal,
584 if (ok && !search.isEmpty()) {
585 m_szFindText = search;
586#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
587 pWeb->findText(m_szFindText, QWebEnginePage::FindFlags(),
588 [&](
const QWebEngineFindTextResult& result){
589 if (result.numberOfMatches() == 0) {
590 emit sigInformation(tr(
"\"%1\" not found.").arg(m_szFindText));
592 emit sigInformation(tr(
"\"%1\" found: %2/%3").arg(m_szFindText, QString::number(result.activeMatch()), QString::number(result.numberOfMatches())));
596 pWeb->findText(m_szFindText, QWebEnginePage::FindFlags(), [
this](
bool found) {
598 emit sigInformation(tr(
"\"%1\" not found.").arg(m_szFindText));
604 m_pFind->setShortcuts(QKeySequence::Find);
605 m_pFind->setStatusTip(m_pFind->text());
607 m_pFindNext = pMenu->addAction(
608 QIcon::fromTheme(
"go-next"), tr(
"Find &Next"),
this,
611 if(pWeb && !m_szFindText.isEmpty()) {
612 pWeb->findText(m_szFindText);
615 m_pFindNext->setShortcuts(QKeySequence::FindNext);
616 m_pFindNext->setText(m_pFindNext->text());
618 m_pFindPrevious = pMenu->addAction(
619 QIcon::fromTheme(
"go-previous"), tr(
"Find &Previous"),
this,
622 if(pWeb && !m_szFindText.isEmpty()) {
623 pWeb->findText(m_szFindText, QWebEnginePage::FindBackward);
626 m_pFindPrevious->setShortcuts(QKeySequence::FindPrevious);
627 m_pFindPrevious->setStatusTip(m_pFindPrevious->text());
629 pMenu->addSeparator();
630 m_pZoomOriginal = pMenu->addAction(
631 QIcon::fromTheme(
"zoom-original"), tr(
"Original"));
632 m_pZoomOriginal->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
633 m_pZoomOriginal->setStatusTip(tr(
"Original"));
634 m_pZoomOriginal->setToolTip(tr(
"Original"));
635 check = connect(m_pZoomOriginal, &QAction::triggered,
this,
639 pWeb->setZoomFactor(1.0);
642 m_pZoomIn = pMenu->addAction(QIcon::fromTheme(
"zoom-in"), tr(
"Zoom in"));
643 m_pZoomIn->setShortcuts(QKeySequence::ZoomIn);
644 m_pZoomIn->setStatusTip(tr(
"Zoom in"));
645 m_pZoomIn->setToolTip(tr(
"Zoom in"));
647 m_pZoomIn, &QAction::triggered,
this,
651 pWeb->setZoomFactor(pWeb->zoomFactor() + 0.1);
654 m_pZoomOut = pMenu->addAction(
655 QIcon::fromTheme(
"zoom-out"), tr(
"Zoom out"));
656 m_pZoomOut->setShortcuts(QKeySequence::ZoomOut);
657 m_pZoomOut->setStatusTip(tr(
"Zoom out"));
658 m_pZoomOut->setToolTip(tr(
"Zoom out"));
660 m_pZoomOut, &QAction::triggered,
this,
664 pWeb->setZoomFactor(pWeb->zoomFactor() - 0.1);
668 pMenu->addSeparator();
669#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
670 m_pPrint = pMenu->addAction(
671 QIcon::fromTheme(
"document-print"), tr(
"Print"),
672 this, &CFrmWebBrowser::slotPrint);
673 m_pPrint->setVisible(
false);
674 m_pPrint->setShortcuts(QKeySequence::Print);
675 m_pPrintToPdf = pMenu->addAction(
676 QIcon::fromTheme(
"document-print"), tr(
"Print to PDF"),
677 this, &CFrmWebBrowser::slotPrintToPdf);
680 pMenu->addAction(m_pDownload);
682 m_pInspector = pMenu->addAction(QIcon::fromTheme(
"tools"), tr(
"Inspector"));
683 check = connect(m_pInspector, &QAction::toggled,
684 this, &CFrmWebBrowser::slotInspector);
686 m_pInspector->setCheckable(
true);
687 m_pInspector->setEnabled(
false);
688 m_pInspector->setShortcuts({
689 QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_I),
690 QKeySequence(Qt::Key_F12)
698int CFrmWebBrowser::Start()
701 if(m_pTab->count() == 0) {
703 m_pAddPage->trigger();
708int CFrmWebBrowser::Stop()
712 for(
int i = 0; i < m_pTab->count(); i++) {
721void CFrmWebBrowser::slotTabCurrentChanged(
int index)
723 if(-1 == index)
return;
726 setWindowTitle(pWeb->title());
727 setWindowIcon(pWeb->icon());
728 m_pUrlLineEdit->setText(pWeb->url().toString());
729 m_pProgressBar->setValue(pWeb->progress());
731 auto page = pWeb->page();
733 auto action = page->action(QWebEnginePage::Back);
734 if(action && m_pBack) {
735 m_pBack->setEnabled(action->isEnabled());
737 action = page->action(QWebEnginePage::Forward);
738 if(action && m_pForward) {
739 m_pForward->setEnabled(action->isEnabled());
741 action = page->action(QWebEnginePage::Reload);
742 if(action && m_pRefresh)
743 m_pRefresh->setEnabled(action->isEnabled());
744 if(m_pRefresh->isEnabled())
745 m_pToolBar->insertAction(m_pUrl, m_pRefresh);
747 m_pToolBar->removeAction(m_pRefresh);
748 action = page->action(QWebEnginePage::Stop);
749 if(action && m_pStop)
750 m_pStop->setEnabled(action->isEnabled());
751 if(m_pStop->isEnabled())
752 m_pToolBar->insertAction(m_pUrl, m_pStop);
754 m_pToolBar->removeAction(m_pStop);
756 m_pInspector->setChecked(CurrentView(ViewType::DevTools));
760 setWindowTitle(tr(
"Web browser"));
761 setWindowIcon(QIcon::fromTheme(
"web-browser"));
762 m_pUrlLineEdit->setText(
"");
763 m_pProgressBar->setValue(100);
766 m_pInspector->setChecked(
false);
771void CFrmWebBrowser::EnableAction(
bool enable)
774 m_pBack->setEnabled(
false);
776 m_pForward->setEnabled(
false);
778 m_pRefresh->setEnabled(enable);
780 m_pStop->setEnabled(
false);
782 m_pFind->setEnabled(enable);
784 m_pFindNext->setEnabled(enable);
786 m_pFindPrevious->setEnabled(enable);
788 m_pZoomOriginal->setEnabled(enable);
790 m_pZoomIn->setEnabled(enable);
792 m_pZoomOut->setEnabled(enable);
794 m_pInspector->setEnabled(enable);
797void CFrmWebBrowser::slotTabCloseRequested(
int index)
799 qDebug(log) <<
"slotTabCloseRequested:" << index;
800 if(-1 == index)
return;
801 auto pView = m_pTab->widget(index);
803 pView->deleteLater();
804 m_pTab->removeTab(index);
807void CFrmWebBrowser::slotViewCloseRequested()
809 CFrmWebView* p = qobject_cast<CFrmWebView*>(sender());
811 int index = IndexOfTab(p);
812 slotTabCloseRequested(index);
815void CFrmWebBrowser::slotReturnPressed()
817 QUrl u = QUrl::fromUserInput(m_pUrlLineEdit->text());
818 qDebug(log) << u << m_pUrlLineEdit->text();
822 szSearch = m_pPara->GetSearchEngine();
823 u = szSearch.replace(m_pPara->GetSearchRelaceString(),
824 QUrl::toPercentEncoding(m_pUrlLineEdit->text()));
827 qDebug(log) << u << m_pUrlLineEdit->text();
828 emit sigInformation(u.toString());
831 pWeb = qobject_cast<CFrmWebView*>(CreateWindow(QWebEnginePage::WebBrowserTab));
833 if(m_pGo->isVisible())
834 m_pGo->setVisible(
false);
837void CFrmWebBrowser::slotInspector(
bool checked)
840 auto dev = CurrentView(ViewType::DevTools);
841 if(pWeb && pWeb->page() && checked) {
843 auto w = m_pTab->currentWidget();
845 QSplitter *pSplitter = qobject_cast<QSplitter*>(w);
846 if(!pSplitter || 1 != pSplitter->count())
return;
847 dev = CreateWebView(pWeb->page()->profile()->isOffTheRecord());
850 pSplitter->addWidget(dev);
851 bool check = connect(pWeb, &CFrmWebView::sigDevToolsRequested,
854 m_pInspector->setChecked(
true);
857 check = connect(dev, &CFrmWebView::sigCloseRequested,
859 m_pInspector->setChecked(
false);
865 pWeb->page()->setDevToolsPage(dev->page());
870 pWeb->page()->setDevToolsPage(
nullptr);
872 dev->setParent(
nullptr);
878int CFrmWebBrowser::Load(QSettings &set)
880 if(m_pPara && m_pPara->GetOpenPrevious()) {
881 set.beginGroup(
"OpenPrevious");
883 nCount = set.value(
"Count", 0).toInt();
884 int nCurrent = set.value(
"Current", -1).toInt();
885 for(
int i = 0; i < nCount; i++)
887 QString u = set.value(
"Url/" + QString::number(i)).toString();
888 auto pView = CreateWindow(QWebEnginePage::WebBrowserTab);
889 pView->load(QUrl(u));
892 history = set.value(
"History/" + QString::number(i)).toByteArray();
893 QDataStream d(&history, QIODevice::ReadWrite);
894 d >> *pView->history();
896 if(-1 < nCurrent && m_pTab->count() > nCurrent)
897 m_pTab->setCurrentIndex(nCurrent);
903int CFrmWebBrowser::Save(QSettings &set)
905 if(m_pPara && m_pPara->GetOpenPrevious()) {
906 set.beginGroup(
"OpenPrevious");
907 set.setValue(
"Count", m_pTab->count());
908 set.setValue(
"Current", m_pTab->currentIndex());
910 for(
int i = 0; i < m_pTab->count(); i++) {
913 set.setValue(
"Url/" + QString::number(i), v->url().toString());
915 QDataStream d(&history, QIODevice::ReadWrite);
917 set.setValue(
"History/" + QString::number(i), history);
926void CFrmWebBrowser::slotPrint()
930#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
932 pWeb->print(&printer);
937void CFrmWebBrowser::slotPrintFinished(
bool success)
939 if(success && m_pPara->GetPromptPrintFinished()) {
940 QMessageBox::information(
this, tr(
"Print finished"),
941 tr(
"Successfully printed"));
945void CFrmWebBrowser::slotPrintToPdf()
950 szPath += RabbitCommon::CDir::Instance()->GetDirUserData()
951 + QDir::separator() +
"pdf";
955 szPath += QDir::separator() + pWeb->page()->title() +
".pdf";
956 qDebug(log) <<
"pdf:" << szPath;
957#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
958 pWeb->printToPdf(szPath);
963void CFrmWebBrowser::slotPdfPrintingFinished(
const QString& szFile,
bool success) {
964 if(success && m_pPara->GetPromptPrintFinished())
965 QMessageBox::information(
this, tr(
"Print to PDF finished"),
966 tr(
"Successfully printed to PDF.") +
"\n"
967 + tr(
"PDF file: ") + szFile);
968 qDebug(log) <<
"Print to PDF:" << szFile << success;
971void CFrmWebBrowser::slotFullScreen(
bool bFullScreen)
977 m_pProgressBar->hide();
978 m_pTab->tabBar()->setVisible(
false);
979 m_szStyleSheet = m_pTab->styleSheet();
980 m_pTab->setStyleSheet(
"QTabWidget::pane{top:0px;left:0px;border:none;}");
983 m_pProgressBar->show();
984 m_pTab->tabBar()->setVisible(
true);
985 m_pTab->setStyleSheet(m_szStyleSheet);
986 if(CurrentView() && CurrentView()->page() && CurrentView()->page()->action(QWebEnginePage::ExitFullScreen))
987 CurrentView()->page()->action(QWebEnginePage::ExitFullScreen)->toggle();
989 emit sigFullScreen(bFullScreen);
void sigUpdateTitle()
Title or icon changed.