From 5c2c90ae6d1ee84f3cd0f4aec38bc59230542890 Mon Sep 17 00:00:00 2001 From: nowrep Date: Fri, 4 Apr 2014 17:03:44 +0200 Subject: [PATCH] [WebTab] More cleanup in detach/attach code. TabbedWebView can now be used with null BrowserWindow pointer. --- src/lib/tabwidget/tabwidget.cpp | 4 +- src/lib/webkit/webpage.cpp | 5 +-- src/lib/webkit/webview.cpp | 1 - src/lib/webtab/tabbedwebview.cpp | 66 ++++++++++++++++---------------- src/lib/webtab/tabbedwebview.h | 12 +++--- src/lib/webtab/webtab.cpp | 24 +++++++----- src/lib/webtab/webtab.h | 2 +- 7 files changed, 59 insertions(+), 55 deletions(-) diff --git a/src/lib/tabwidget/tabwidget.cpp b/src/lib/tabwidget/tabwidget.cpp index b66619db2..554b005dc 100644 --- a/src/lib/tabwidget/tabwidget.cpp +++ b/src/lib/tabwidget/tabwidget.cpp @@ -362,7 +362,7 @@ int TabWidget::addView(const LoadRequest &req, const QString &title, const Qz::N m_locationBars->addWidget(webTab->locationBar()); int index = insertTab(position == -1 ? count() : position, webTab, QString(), pinned); - webTab->attach(m_window, m_tabBar); + webTab->attach(m_window); if (!title.isEmpty()) { m_tabBar->setTabText(index, title); @@ -426,7 +426,7 @@ int TabWidget::addView(WebTab* tab) { m_locationBars->addWidget(tab->locationBar()); int index = addTab(tab, QString()); - tab->attach(m_window, m_tabBar); + tab->attach(m_window); connect(tab->webView(), SIGNAL(wantsCloseTab(int)), this, SLOT(closeTab(int))); connect(tab->webView(), SIGNAL(changed()), this, SIGNAL(changed())); diff --git a/src/lib/webkit/webpage.cpp b/src/lib/webkit/webpage.cpp index 84b69f7d4..81f85c175 100644 --- a/src/lib/webkit/webpage.cpp +++ b/src/lib/webkit/webpage.cpp @@ -17,7 +17,6 @@ * ============================================================ */ #include "webpage.h" #include "tabbedwebview.h" -#include "tabwidget.h" #include "browserwindow.h" #include "pluginproxy.h" #include "downloadmanager.h" @@ -579,7 +578,7 @@ void WebPage::populateNetworkRequest(QNetworkRequest &request) QWebPage* WebPage::createWindow(QWebPage::WebWindowType type) { if (m_view) { - return new PopupWebPage(type, m_view->mainWindow()); + return new PopupWebPage(type, m_view->browserWindow()); } if (PopupWebPage* popupPage = qobject_cast(this)) { @@ -597,7 +596,7 @@ QObject* WebPage::createPlugin(const QString &classid, const QUrl &url, Q_UNUSED(paramValues) if (classid == QLatin1String("RecoveryWidget") && mApp->restoreManager() && m_view) { - return new RecoveryWidget(m_view, m_view->mainWindow()); + return new RecoveryWidget(m_view, m_view->browserWindow()); } else { mainFrame()->load(QUrl("qupzilla:start")); diff --git a/src/lib/webkit/webview.cpp b/src/lib/webkit/webview.cpp index 9b9f5412c..b729f90e7 100644 --- a/src/lib/webkit/webview.cpp +++ b/src/lib/webkit/webview.cpp @@ -15,7 +15,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ - #include "webview.h" #include "webpage.h" #include "mainapplication.h" diff --git a/src/lib/webtab/tabbedwebview.cpp b/src/lib/webtab/tabbedwebview.cpp index 029be1277..989b47562 100644 --- a/src/lib/webtab/tabbedwebview.cpp +++ b/src/lib/webtab/tabbedwebview.cpp @@ -38,9 +38,9 @@ #include #include -TabbedWebView::TabbedWebView(BrowserWindow* window, WebTab* webTab) +TabbedWebView::TabbedWebView(WebTab* webTab) : WebView(webTab) - , m_window(window) + , m_window(0) , m_webTab(webTab) , m_menu(new Menu(this)) { @@ -50,11 +50,6 @@ TabbedWebView::TabbedWebView(BrowserWindow* window, WebTab* webTab) connect(this, SIGNAL(loadProgress(int)), this, SLOT(slotLoadProgress(int))); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished())); connect(this, SIGNAL(urlChanged(QUrl)), this, SLOT(urlChanged(QUrl))); - connect(this, SIGNAL(statusBarMessage(QString)), m_window->statusBar(), SLOT(showMessage(QString))); -} - -TabbedWebView::~TabbedWebView() -{ } void TabbedWebView::setWebPage(WebPage* page) @@ -66,9 +61,27 @@ void TabbedWebView::setWebPage(WebPage* page) connect(page, SIGNAL(linkHovered(QString,QString,QString)), this, SLOT(linkHovered(QString,QString,QString))); } +BrowserWindow* TabbedWebView::browserWindow() const +{ + return m_window; +} + +void TabbedWebView::setBrowserWindow(BrowserWindow* window) +{ + if (m_window) { + disconnect(this, SIGNAL(statusBarMessage(QString)), m_window->statusBar(), SLOT(showMessage(QString))); + } + + m_window = window; + + if (m_window) { + connect(this, SIGNAL(statusBarMessage(QString)), m_window->statusBar(), SLOT(showMessage(QString))); + } +} + void TabbedWebView::inspectElement() { - m_window->showWebInspector(); + m_webTab->showWebInspector(); triggerPageAction(QWebPage::InspectElement); } @@ -79,7 +92,8 @@ WebTab* TabbedWebView::webTab() const TabWidget* TabbedWebView::tabWidget() const { - return m_window->tabWidget(); + // FIXME:!! + return m_window ? m_window->tabWidget() : 0; } QString TabbedWebView::getIp() const @@ -89,7 +103,7 @@ QString TabbedWebView::getIp() const void TabbedWebView::urlChanged(const QUrl &url) { - if (m_webTab->isCurrentTab()) { + if (m_webTab->isCurrentTab() && m_window) { m_window->navigationBar()->refreshHistory(); } @@ -102,7 +116,7 @@ void TabbedWebView::slotLoadProgress(int prog) { Q_UNUSED(prog) - if (m_webTab->isCurrentTab()) { + if (m_webTab->isCurrentTab() && m_window) { m_window->updateLoadingActions(); } } @@ -127,7 +141,7 @@ void TabbedWebView::slotLoadFinished() { QHostInfo::lookupHost(url().host(), this, SLOT(setIp(QHostInfo))); - if (m_webTab->isCurrentTab()) { + if (m_webTab->isCurrentTab() && m_window) { m_window->updateLoadingActions(); } } @@ -150,7 +164,7 @@ void TabbedWebView::linkHovered(const QString &link, const QString &title, const Q_UNUSED(title) Q_UNUSED(content) - if (m_webTab->isCurrentTab()) { + if (m_webTab->isCurrentTab() && m_window) { if (link.isEmpty()) { m_window->statusBarMessage()->clearMessage(); } @@ -169,20 +183,6 @@ int TabbedWebView::tabIndex() const return m_webTab->tabIndex(); } -BrowserWindow* TabbedWebView::mainWindow() const -{ - return m_window; -} - -void TabbedWebView::moveToWindow(BrowserWindow* window) -{ - if (m_window != window) { - disconnect(this, SIGNAL(statusBarMessage(QString)), m_window->statusBar(), SLOT(showMessage(QString))); - m_window = window; - connect(this, SIGNAL(statusBarMessage(QString)), m_window->statusBar(), SLOT(showMessage(QString))); - } -} - QWidget* TabbedWebView::overlayWidget() { return m_webTab; @@ -196,7 +196,7 @@ void TabbedWebView::contextMenuEvent(QContextMenuEvent* event) createContextMenu(m_menu, hitTest, event->pos()); - if (!hitTest.isContentEditable() && !hitTest.isContentSelected()) { + if (!hitTest.isContentEditable() && !hitTest.isContentSelected() && m_window) { m_menu->addAction(m_window->adBlockIcon()->menuAction()); } @@ -227,9 +227,11 @@ void TabbedWebView::openNewTab() void TabbedWebView::loadInNewTab(const LoadRequest &req, Qz::NewTabPositionFlags position) { - int index = tabWidget()->addView(QUrl(), position); - m_window->weView(index)->webTab()->locationBar()->showUrl(req.url()); - m_window->weView(index)->load(req); + if (m_window) { + int index = tabWidget()->addView(QUrl(), position); + m_window->weView(index)->webTab()->locationBar()->showUrl(req.url()); + m_window->weView(index)->load(req); + } } void TabbedWebView::setAsCurrentTab() @@ -239,7 +241,7 @@ void TabbedWebView::setAsCurrentTab() void TabbedWebView::mouseMoveEvent(QMouseEvent* event) { - if (m_window->isFullScreen()) { + if (m_window && m_window->isFullScreen()) { if (m_window->fullScreenNavigationVisible()) { m_window->hideNavigationWithFullScreen(); } diff --git a/src/lib/webtab/tabbedwebview.h b/src/lib/webtab/tabbedwebview.h index 605842d22..b3bc45d61 100644 --- a/src/lib/webtab/tabbedwebview.h +++ b/src/lib/webtab/tabbedwebview.h @@ -34,10 +34,12 @@ class QUPZILLA_EXPORT TabbedWebView : public WebView { Q_OBJECT public: - explicit TabbedWebView(BrowserWindow* window, WebTab* webTab); - ~TabbedWebView(); + explicit TabbedWebView(WebTab* webTab); - void setWebPage(WebPage* pag); + void setWebPage(WebPage* page); + + BrowserWindow* browserWindow() const; + void setBrowserWindow(BrowserWindow* window); WebTab* webTab() const; TabWidget* tabWidget() const; @@ -45,9 +47,6 @@ public: QString getIp() const; int tabIndex() const; - BrowserWindow* mainWindow() const; - void moveToWindow(BrowserWindow* window); - QWidget* overlayWidget(); signals: @@ -82,7 +81,6 @@ private: Menu* m_menu; QString m_currentIp; - }; #endif // TABBEDWEBVIEW_H diff --git a/src/lib/webtab/webtab.cpp b/src/lib/webtab/webtab.cpp index 0ac078f09..47f8c7ed6 100644 --- a/src/lib/webtab/webtab.cpp +++ b/src/lib/webtab/webtab.cpp @@ -97,9 +97,10 @@ WebTab::WebTab(BrowserWindow* window) // This fixes background of pages with dark themes setStyleSheet("#webtab {background-color:white;}"); - m_webView = new TabbedWebView(m_window, this); + m_webView = new TabbedWebView(this); + m_webView->setBrowserWindow(m_window); + m_webView->setWebPage(new WebPage(this)); m_webView->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); - m_webView->setWebPage(new WebPage(m_webView)); m_locationBar = new LocationBar(m_window); m_locationBar->setWebView(m_webView); @@ -178,19 +179,24 @@ void WebTab::detach() // Remove icon from tab m_tabBar->setTabButton(tabIndex(), m_tabBar->iconButtonPosition(), 0); + // Remove the tab from tabbar + setParent(0); + // Remove the locationbar from window + m_locationBar->setParent(this); + // Detach TabbedWebView + m_webView->setBrowserWindow(0); + + // WebTab is now standalone widget m_window = 0; m_tabBar = 0; - - setParent(0); - m_locationBar->setParent(this); } -void WebTab::attach(BrowserWindow* window, TabBar* tabBar) +void WebTab::attach(BrowserWindow* window) { m_window = window; - m_tabBar = tabBar; + m_tabBar = m_window->tabWidget()->getTabBar(); - m_webView->moveToWindow(m_window); + m_webView->setBrowserWindow(m_window); m_tabBar->setTabButton(tabIndex(), m_tabBar->iconButtonPosition(), m_tabIcon); m_tabBar->setTabText(tabIndex(), title()); } @@ -207,7 +213,6 @@ QByteArray WebTab::historyData() const QByteArray historyArray; QDataStream historyStream(&historyArray, QIODevice::WriteOnly); historyStream << *m_webView->history(); - return historyArray; } else { @@ -329,6 +334,7 @@ QPixmap WebTab::renderTabPreview() p.end(); page->setViewportSize(oldSize); + // Restore also scrollbar positions, to prevent messing scrolling to anchor links page->mainFrame()->setScrollBarValue(Qt::Vertical, originalScrollPosition.y()); page->mainFrame()->setScrollBarValue(Qt::Horizontal, originalScrollPosition.x()); diff --git a/src/lib/webtab/webtab.h b/src/lib/webtab/webtab.h index c88ce3e53..d5af8f3bb 100644 --- a/src/lib/webtab/webtab.h +++ b/src/lib/webtab/webtab.h @@ -67,7 +67,7 @@ public: QWebHistory* history() const; void detach(); - void attach(BrowserWindow* window, TabBar* tabBar); + void attach(BrowserWindow* window); void setHistoryData(const QByteArray &data); QByteArray historyData() const;