2929#include " FrmWebBrowser.h"
3030#include " FrmPopup.h"
3131#include " CaptureFullPage.h"
32+ #include " History/FrmHistory.h"
33+ #include " AddressCompleter.h"
3234
3335static Q_LOGGING_CATEGORY (log, " WebBrowser.Browser" )
3436CFrmWebBrowser::CFrmWebBrowser(CParameterWebBrowser *pPara, bool bMenuBar, QWidget *parent)
@@ -65,10 +67,22 @@ CFrmWebBrowser::CFrmWebBrowser(CParameterWebBrowser *pPara, bool bMenuBar, QWidg
6567 , m_pCaptureFulPage(nullptr )
6668 , m_pRecord(nullptr )
6769 , m_pMultimediaRecord(nullptr )
70+ , m_pHistoryDatabase(nullptr )
6871{
6972 qDebug (log) << Q_FUNC_INFO;
7073 bool check = false ;
7174
75+ m_pHistoryDatabase = new CHistoryDatabase (this );
76+ if (m_pHistoryDatabase) {
77+ QString szDb = GetProfile ()->persistentStoragePath ()
78+ + QDir::separator () + " History.db" ;
79+ bool bRet = m_pHistoryDatabase->openDatabase (szDb);
80+ if (!bRet) {
81+ delete m_pHistoryDatabase;
82+ m_pHistoryDatabase = nullptr ;
83+ }
84+ }
85+
7286 setWindowIcon (QIcon::fromTheme (" web-browser" ));
7387
7488 QVBoxLayout* pLayout = new QVBoxLayout (this );
@@ -119,12 +133,6 @@ CFrmWebBrowser::CFrmWebBrowser(CParameterWebBrowser *pPara, bool bMenuBar, QWidg
119133 m_pUrlLineEdit->addAction (m_pFavAction, QLineEdit::LeadingPosition);
120134 m_pUrlLineEdit->setClearButtonEnabled (true );
121135 m_pUrl = m_pToolBar->addWidget (m_pUrlLineEdit);
122- check = connect (m_pUrlLineEdit, &QLineEdit::returnPressed,
123- this , &CFrmWebBrowser::slotReturnPressed);
124- Q_ASSERT (check);
125- check = connect (m_pUrlLineEdit, &QLineEdit::editingFinished,
126- this , &CFrmWebBrowser::slotReturnPressed);
127- Q_ASSERT (check);
128136 m_pGo = new QAction (QIcon::fromTheme (" go-next" ), tr (" go" ), m_pUrlLineEdit);
129137 m_pGo->setStatusTip (m_pGo->text ());
130138 check = connect (m_pGo, &QAction::triggered, this , &CFrmWebBrowser::slotReturnPressed);
@@ -145,6 +153,28 @@ CFrmWebBrowser::CFrmWebBrowser(CParameterWebBrowser *pPara, bool bMenuBar, QWidg
145153 }
146154 });
147155 Q_ASSERT (check);
156+ // 创建地址栏自动完成器
157+ auto pAddressCompleter = new CAddressCompleter (this );
158+ pAddressCompleter->setHistoryDatabase (m_pHistoryDatabase);
159+ pAddressCompleter->attachToLineEdit (m_pUrlLineEdit);
160+ pAddressCompleter->setMaxVisibleItems (50 );
161+ check = connect (pAddressCompleter, &CAddressCompleter::urlSelected,
162+ this , &CFrmWebBrowser::slotUrlSelected);
163+ Q_ASSERT (check);
164+ check = connect (pAddressCompleter, &CAddressCompleter::searchRequested,
165+ this , [&](const QString& keyword) {
166+ qDebug (log) << " CAddressCompleter::searchRequested keyword:" << keyword;
167+ QString szSearch;
168+ QString szUrl;
169+ if (m_pPara) {
170+ szSearch = m_pPara->GetSearchEngine ();
171+ szUrl = szSearch.replace (m_pPara->GetSearchRelaceString (),
172+ QUrl::toPercentEncoding (keyword));
173+ if (!szUrl.isEmpty ())
174+ slotUrlSelected (szUrl);
175+ }
176+ });
177+ Q_ASSERT (check);
148178
149179 m_pAddPage = m_pToolBar->addAction (QIcon::fromTheme (" add" ), tr (" Add tab page" ),
150180 this , [&](){
@@ -343,10 +373,13 @@ void CFrmWebBrowser::SetConnect(CFrmWebView* pWeb)
343373 }
344374 });
345375 check = connect (pWeb, &QWebEngineView::urlChanged,
346- this , [&](const QUrl &url){
376+ this , [&](const QUrl &url) {
347377 CFrmWebView* pWeb = qobject_cast<CFrmWebView*>(sender ());
348378 if (IsCurrentView (pWeb))
349379 m_pUrlLineEdit->setText (url.toString ());
380+ if (m_pHistoryDatabase) {
381+ m_pHistoryDatabase->addHistoryEntry (url.toString (), " " );
382+ }
350383 });
351384 Q_ASSERT (check);
352385 check = connect (pWeb, &CFrmWebView::titleChanged,
@@ -359,6 +392,9 @@ void CFrmWebBrowser::SetConnect(CFrmWebView* pWeb)
359392 setWindowTitle (title);
360393 emit sigUpdateTitle ();
361394 }
395+ if (m_pHistoryDatabase) {
396+ m_pHistoryDatabase->updateHistoryEntry (pWeb->url ().toString (), title);
397+ }
362398 });
363399 Q_ASSERT (check);
364400 check = connect (pWeb, &CFrmWebView::favIconChanged,
@@ -371,6 +407,9 @@ void CFrmWebBrowser::SetConnect(CFrmWebView* pWeb)
371407 setWindowIcon (icon);
372408 emit sigUpdateTitle ();
373409 }
410+ if (m_pHistoryDatabase) {
411+ m_pHistoryDatabase->updateHistoryEntry (pWeb->url ().toString (), QString (), icon);
412+ }
374413 });
375414 Q_ASSERT (check);
376415 check = connect (pWeb, &CFrmWebView::sigLinkHovered,
@@ -442,7 +481,16 @@ QWebEngineProfile* CFrmWebBrowser::GetProfile(bool offTheRecord)
442481 bool check = connect (m_profile.get (), &QWebEngineProfile::downloadRequested,
443482 &m_DownloadManager, &CFrmDownloadManager::slotDownloadRequested);
444483 Q_ASSERT (check);
484+ // m_profile->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies);
485+ // m_profile->setPersistentStoragePath(m_profile->cachePath() + QDir::separator() + "Persistent");
486+ // m_profile->setHttpCacheMaximumSize(50);
445487 qDebug (log) << " User agent:" << m_profile->httpUserAgent ()
488+ #if QT_VERSION > QT_VERSION_CHECK(6, 8, 0)
489+ // << "AllPermissions:" << m_profile->listAllPermissions()
490+ << " persistentPermissionsPolicy:" << m_profile->persistentPermissionsPolicy ()
491+ #endif
492+ << " persistentCookiesPolicy:" << m_profile->persistentCookiesPolicy ()
493+ << " httpCacheMaximumSize:" << m_profile->httpCacheMaximumSize ()
446494 << " Persistent path:" << m_profile->persistentStoragePath ()
447495 << " Cache path:" << m_profile->cachePath ()
448496 << " Storage name:" << m_profile->storageName ()
@@ -544,7 +592,7 @@ int CFrmWebBrowser::InitMenu(QMenu *pMenu)
544592 pMenu->addAction (m_pForward);
545593 pMenu->addAction (m_pRefresh);
546594 m_pStop = pMenu->addAction (
547- QIcon::fromTheme (" media-playback-stop" ), tr (" Stop" ), this , [&](){
595+ QIcon::fromTheme (" media-playback-stop" ), tr (" Stop" ), this , [&]() {
548596 CFrmWebView* pWeb = CurrentView ();
549597 if (pWeb && pWeb->page ())
550598 pWeb->page ()->action (QWebEnginePage::Stop)->trigger ();
@@ -553,11 +601,34 @@ int CFrmWebBrowser::InitMenu(QMenu *pMenu)
553601 m_pStop->setShortcuts (QKeySequence::Cancel);
554602 m_pStop->setStatusTip (m_pStop->text ());
555603
604+ pMenu->addSeparator ();
605+ pMenu->addAction (tr (" History" ), this , [&]() {
606+ CFrmHistory* pHistory = new CFrmHistory (m_pHistoryDatabase, &m_pPara->m_History );
607+ if (!pHistory) return ;
608+ pHistory->setAttribute (Qt::WA_DeleteOnClose);
609+ connect (this , &CFrmWebBrowser::destroyed, pHistory, &CFrmHistory::close);
610+ connect (pHistory, &CFrmHistory::sigOpenUrl, this , [&](const QString& url) {
611+ CFrmWebView* pWeb = CurrentView ();
612+ if (!pWeb) {
613+ pWeb = qobject_cast<CFrmWebView*>(CreateWindow (QWebEnginePage::WebBrowserTab));
614+ }
615+ if (pWeb)
616+ pWeb->load (url);
617+ });
618+ connect (pHistory, &CFrmHistory::sigOpenUrlInNewTab,
619+ this , [&](const QString& url) {
620+ auto pWeb = qobject_cast<CFrmWebView*>(CreateWindow (QWebEnginePage::WebBrowserTab));
621+ if (pWeb)
622+ pWeb->load (url);
623+ });
624+ pHistory->show ();
625+ });
626+
556627 pMenu->addSeparator ();
557628 pMenu->addAction (m_pAddPage);
558629 m_pAddPageIncognito = pMenu->addAction (
559630 QIcon::fromTheme (" add" ), tr (" Add incognito tab" ),
560- this , [&](){
631+ this , [&]() {
561632 CreateWindow (QWebEnginePage::WebBrowserTab, true );
562633 if (!m_pPara->GetTabUrl ().isEmpty ()) {
563634 m_pUrlLineEdit->setText (m_pPara->GetTabUrl ());
@@ -567,14 +638,14 @@ int CFrmWebBrowser::InitMenu(QMenu *pMenu)
567638 m_pAddPageIncognito->setStatusTip (m_pAddPageIncognito->text ());
568639 m_pAddWindow = pMenu->addAction (
569640 QIcon::fromTheme (" add" ), tr (" Add window" ),
570- this , [&](){
641+ this , [&]() {
571642 CreateWindow (QWebEnginePage::WebBrowserWindow);
572643 });
573644 m_pAddWindow->setVisible (false );
574645 m_pAddWindow->setStatusTip (m_pAddWindow->text ());
575646 m_pAddWindowIncognito = pMenu->addAction (
576647 QIcon::fromTheme (" add" ), tr (" Add Incognito Window" ),
577- this , [&](){
648+ this , [&]() {
578649 CreateWindow (QWebEnginePage::WebBrowserWindow, true );
579650 });
580651 m_pAddWindowIncognito->setVisible (false );
@@ -583,7 +654,7 @@ int CFrmWebBrowser::InitMenu(QMenu *pMenu)
583654 pMenu->addSeparator ();
584655 m_pFind = pMenu->addAction (
585656 QIcon::fromTheme (" edit-find" ), tr (" &Find" ), this ,
586- [&](){
657+ [&]() {
587658 CFrmWebView* pWeb = CurrentView ();
588659 if (pWeb) {
589660 bool ok = false ;
@@ -856,22 +927,28 @@ void CFrmWebBrowser::slotViewCloseRequested()
856927
857928void CFrmWebBrowser::slotReturnPressed ()
858929{
859- QUrl u = QUrl::fromUserInput (m_pUrlLineEdit->text ());
860- qDebug (log) << u << m_pUrlLineEdit->text ();
861- if (u.isEmpty ()) {
930+ slotUrlSelected (m_pUrlLineEdit->text ());
931+ }
932+
933+ void CFrmWebBrowser::slotUrlSelected (const QString &szUrl)
934+ {
935+ if (szUrl.isEmpty ()) return ;
936+ QUrl url = QUrl::fromUserInput (szUrl);
937+ qDebug (log) << url << szUrl << url.isValid ();
938+ if (szUrl.startsWith (" @search:" , Qt::CaseInsensitive)) {
862939 QString szSearch;
940+ QString keyword = szUrl.mid (8 );
863941 if (m_pPara) {
864942 szSearch = m_pPara->GetSearchEngine ();
865- u = szSearch.replace (m_pPara->GetSearchRelaceString (),
866- QUrl::toPercentEncoding (m_pUrlLineEdit-> text () ));
943+ url = szSearch.replace (m_pPara->GetSearchRelaceString (),
944+ QUrl::toPercentEncoding (keyword ));
867945 }
868946 }
869- qDebug (log) << u << m_pUrlLineEdit->text ();
870- emit sigInformation (u.toString ());
947+ emit sigInformation (url.toString ());
871948 CFrmWebView* pWeb = CurrentView ();
872949 if (!pWeb)
873950 pWeb = qobject_cast<CFrmWebView*>(CreateWindow (QWebEnginePage::WebBrowserTab));
874- pWeb->load (u );
951+ pWeb->load (url );
875952 if (m_pGo->isVisible ())
876953 m_pGo->setVisible (false );
877954}
0 commit comments