Skip to content

Commit 5f8959f

Browse files
committed
Plugins::WebBrowser: add history
1 parent 0cfbed9 commit 5f8959f

19 files changed

+1435
-32
lines changed

Plugins/FtpServer/ParameterFtpServer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ CParameterFtpServer::CParameterFtpServer(QObject *parent, const QString &szPrefi
88
, m_nPort(21)
99
, m_bAnonymousLogin(true)
1010
, m_bReadOnly(true)
11-
, m_ConnectCount(-1)
11+
, m_ConnectCount(2)
1212
, m_bListenAll(true)
1313
{}
1414

Plugins/WebBrowser/CMakeLists.txt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ set(CMAKE_AUTORCC ON)
99
set(CMAKE_CXX_STANDARD 17)
1010
set(CMAKE_CXX_STANDARD_REQUIRED ON)
1111

12-
set(WebBrowser_QT_COMPONENTS Core Gui Widgets WebEngineWidgets WebEngineCore)
12+
set(WebBrowser_QT_COMPONENTS Core Gui Widgets WebEngineWidgets WebEngineCore Sql)
1313
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS ${WebBrowser_QT_COMPONENTS})
1414
if(Qt${QT_VERSION_MAJOR}_FOUND)
1515
FOREACH(_COMPONENT ${WebBrowser_QT_COMPONENTS})
@@ -35,6 +35,11 @@ set(WebBrowser_SOURCE_FILES
3535
PasswordStore.cpp
3636
CaptureFullPage.cpp
3737
MultimediaRecord.cpp
38+
History/FrmHistory.cpp
39+
History/HistoryDatabase.cpp
40+
History/HistoryModel.cpp
41+
History/ParameterHistory.cpp
42+
AddressCompleter.cpp
3843
)
3944
set(WebBrowser_HEADER_FILES
4045
PluginWebBrowser.h
@@ -49,11 +54,17 @@ set(WebBrowser_HEADER_FILES
4954
PasswordStore.h
5055
CaptureFullPage.h
5156
MultimediaRecord.h
57+
History/FrmHistory.h
58+
History/HistoryDatabase.h
59+
History/HistoryModel.h
60+
History/ParameterHistory.h
61+
AddressCompleter.h
5262
)
5363
set(WebBrowser_UI_FILES
5464
FrmDownload.ui
5565
DlgSettings.ui
5666
DlgWebAuth.ui
67+
History/FrmHistory.ui
5768
Resource/Resource.qrc
5869
)
5970
if(QT_VERSION GREATER_EQUAL "6.7.0")

Plugins/WebBrowser/FrmDownloadManager.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#ifndef FRMDOWNLOADMANAGER_H
2-
#define FRMDOWNLOADMANAGER_H
1+
// Author: Kang Lin <[email protected]>
32

3+
#pragma once
44
#include <QWidget>
55
#include <QVBoxLayout>
66
#include "FrmDownload.h"
@@ -30,5 +30,3 @@ private Q_SLOTS:
3030
QVBoxLayout* m_pItems;
3131
CParameterWebBrowser* m_pPara;
3232
};
33-
34-
#endif // FRMDOWNLOADMANAGER_H

Plugins/WebBrowser/FrmPopup.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// Author: Kang Lin <[email protected]>
12

23
#include <QIcon>
34
#include <QVBoxLayout>

Plugins/WebBrowser/FrmWebBrowser.cpp

Lines changed: 97 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
#include "FrmWebBrowser.h"
3030
#include "FrmPopup.h"
3131
#include "CaptureFullPage.h"
32+
#include "History/FrmHistory.h"
33+
#include "AddressCompleter.h"
3234

3335
static Q_LOGGING_CATEGORY(log, "WebBrowser.Browser")
3436
CFrmWebBrowser::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

857928
void 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
}

Plugins/WebBrowser/FrmWebBrowser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "FrmDownloadManager.h"
1717
#include "ParameterWebBrowser.h"
1818
#include "MultimediaRecord.h"
19+
#include "History/HistoryDatabase.h"
1920

2021
class CFrmWebBrowser : public QWidget
2122
{
@@ -53,6 +54,7 @@ private Q_SLOTS:
5354
void slotTabCloseRequested(int index);
5455
void slotViewCloseRequested();
5556
void slotReturnPressed();
57+
void slotUrlSelected(const QString& szUrl);
5658
void slotInspector(bool checked);
5759

5860
void slotPrint();
@@ -125,4 +127,6 @@ public Q_SLOTS:
125127

126128
CMultimediaRecordThread* m_pMultimediaRecord;
127129
QTimer m_tmRecord;
130+
131+
CHistoryDatabase* m_pHistoryDatabase;
128132
};

0 commit comments

Comments
 (0)