2011-03-03 18:29:20 +01:00
/* ============================================================
* QupZilla - WebKit based browser
2011-10-17 09:57:07 +02:00
* Copyright ( C ) 2010 - 2011 David Rosca
2011-03-03 18:29:20 +01:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2011-03-02 16:57:41 +01:00
# include "webview.h"
# include "qupzilla.h"
# include "webpage.h"
# include "tabwidget.h"
# include "historymodel.h"
# include "locationbar.h"
# include "downloadmanager.h"
# include "networkmanager.h"
# include "autofillmodel.h"
# include "networkmanagerproxy.h"
2011-03-19 13:15:01 +01:00
# include "networkmanager.h"
2011-03-02 16:57:41 +01:00
# include "mainapplication.h"
# include "tabbar.h"
# include "pluginproxy.h"
2011-04-25 20:56:45 +02:00
# include "iconprovider.h"
2011-03-02 16:57:41 +01:00
# include "webtab.h"
2011-05-09 17:58:19 +02:00
# include "statusbarmessage.h"
2011-07-11 20:30:49 +02:00
# include "progressbar.h"
2011-09-11 19:15:06 +02:00
# include "navigationbar.h"
2011-03-02 16:57:41 +01:00
2011-05-22 10:47:03 +02:00
WebView : : WebView ( QupZilla * mainClass , WebTab * webTab )
2011-07-19 15:18:49 +02:00
: QWebView ( webTab )
2011-03-02 16:57:41 +01:00
, p_QupZilla ( mainClass )
, m_progress ( 0 )
, m_isLoading ( false )
, m_currentZoom ( 100 )
, m_aboutToLoadUrl ( QUrl ( ) )
2011-03-10 16:23:53 +01:00
, m_lastUrl ( QUrl ( ) )
2011-03-02 16:57:41 +01:00
, m_wantsClose ( false )
, m_page ( new WebPage ( this , p_QupZilla ) )
2011-05-22 10:47:03 +02:00
, m_webTab ( webTab )
2011-07-11 20:30:49 +02:00
, m_locationBar ( 0 )
2011-04-22 07:45:15 +02:00
, m_mouseTrack ( false )
, m_navigationVisible ( false )
2011-05-22 10:47:03 +02:00
, m_mouseWheelEnabled ( true )
2011-03-02 16:57:41 +01:00
//,m_loadingTimer(0)
{
m_networkProxy = new NetworkManagerProxy ( p_QupZilla ) ;
2011-03-04 13:59:07 +01:00
m_networkProxy - > setPrimaryNetworkAccessManager ( mApp - > networkManager ( ) ) ;
2011-03-18 15:01:01 +01:00
m_networkProxy - > setPage ( m_page ) ;
2011-03-02 16:57:41 +01:00
m_networkProxy - > setView ( this ) ;
m_page - > setNetworkAccessManager ( m_networkProxy ) ;
m_page - > setView ( this ) ;
setPage ( m_page ) ;
connect ( this , SIGNAL ( loadStarted ( ) ) , this , SLOT ( loadStarted ( ) ) ) ;
connect ( this , SIGNAL ( loadProgress ( int ) ) , this , SLOT ( setProgress ( int ) ) ) ;
connect ( this , SIGNAL ( loadFinished ( bool ) ) , this , SLOT ( loadFinished ( bool ) ) ) ;
connect ( this , SIGNAL ( linkClicked ( QUrl ) ) , this , SLOT ( linkClicked ( QUrl ) ) ) ;
connect ( this , SIGNAL ( urlChanged ( QUrl ) ) , this , SLOT ( urlChanged ( QUrl ) ) ) ;
2011-03-18 15:01:01 +01:00
connect ( this , SIGNAL ( titleChanged ( QString ) ) , this , SLOT ( titleChanged ( ) ) ) ;
2011-03-31 16:01:59 +02:00
connect ( this , SIGNAL ( iconChanged ( ) ) , this , SLOT ( slotIconChanged ( ) ) ) ;
2011-03-02 16:57:41 +01:00
connect ( this , SIGNAL ( statusBarMessage ( QString ) ) , p_QupZilla - > statusBar ( ) , SLOT ( showMessage ( QString ) ) ) ;
connect ( page ( ) , SIGNAL ( linkHovered ( QString , QString , QString ) ) , this , SLOT ( linkHovered ( QString , QString , QString ) ) ) ;
connect ( page ( ) , SIGNAL ( windowCloseRequested ( ) ) , this , SLOT ( closeTab ( ) ) ) ;
connect ( page ( ) , SIGNAL ( downloadRequested ( const QNetworkRequest & ) ) , this , SLOT ( downloadRequested ( const QNetworkRequest & ) ) ) ;
2011-03-04 13:59:07 +01:00
connect ( mApp - > networkManager ( ) , SIGNAL ( finishLoading ( bool ) ) , this , SLOT ( loadFinished ( bool ) ) ) ;
connect ( mApp - > networkManager ( ) , SIGNAL ( wantsFocus ( QUrl ) ) , this , SLOT ( getFocus ( QUrl ) ) ) ;
2011-03-02 16:57:41 +01:00
2011-04-22 07:45:15 +02:00
connect ( p_QupZilla , SIGNAL ( setWebViewMouseTracking ( bool ) ) , this , SLOT ( trackMouse ( bool ) ) ) ;
2011-03-02 16:57:41 +01:00
//Zoom levels same as in firefox
m_zoomLevels < < 30 < < 50 < < 67 < < 80 < < 90 < < 100 < < 110 < < 120 < < 133 < < 150 < < 170 < < 200 < < 240 < < 300 ;
}
2011-03-31 16:01:59 +02:00
void WebView : : slotIconChanged ( )
{
2011-04-04 16:00:27 +02:00
m_siteIcon = icon ( ) ;
2011-04-26 10:03:17 +02:00
if ( url ( ) . toString ( ) . contains ( " file:// " ) | | title ( ) . contains ( tr ( " Failed loading page " ) ) )
return ;
mApp - > iconProvider ( ) - > saveIcon ( this ) ;
2011-03-31 16:01:59 +02:00
}
2011-03-22 21:36:15 +01:00
WebPage * WebView : : webPage ( ) const
2011-03-02 16:57:41 +01:00
{
return m_page ;
}
2011-05-22 10:47:03 +02:00
WebTab * WebView : : webTab ( ) const
{
return m_webTab ;
}
2011-03-02 16:57:41 +01:00
bool WebView : : isCurrent ( )
{
if ( ! tabWidget ( ) )
return false ;
2011-03-03 15:54:12 +01:00
WebTab * webTab = qobject_cast < WebTab * > ( tabWidget ( ) - > widget ( tabWidget ( ) - > currentIndex ( ) ) ) ;
if ( ! webTab )
return false ;
2011-03-02 16:57:41 +01:00
2011-03-03 15:54:12 +01:00
return ( webTab - > view ( ) = = this ) ;
2011-03-02 16:57:41 +01:00
}
void WebView : : urlChanged ( const QUrl & url )
{
2011-10-15 18:08:52 +02:00
if ( isCurrent ( ) )
2011-09-11 19:15:06 +02:00
p_QupZilla - > navigationBar ( ) - > refreshHistory ( ) ;
2011-10-15 18:08:52 +02:00
2011-03-29 20:30:05 +02:00
if ( m_lastUrl ! = url )
emit changed ( ) ;
2011-10-15 18:08:52 +02:00
emit showUrl ( url ) ;
2011-03-02 16:57:41 +01:00
}
void WebView : : linkClicked ( const QUrl & url )
{
2011-07-31 13:33:44 +02:00
load ( url ) ;
2011-03-02 16:57:41 +01:00
}
void WebView : : setProgress ( int prog )
{
m_progress = prog ;
2011-03-03 14:25:02 +01:00
checkRss ( ) ;
2011-07-11 20:30:49 +02:00
if ( isCurrent ( ) ) {
p_QupZilla - > ipLabel ( ) - > hide ( ) ;
p_QupZilla - > progressBar ( ) - > setVisible ( true ) ;
p_QupZilla - > progressBar ( ) - > setValue ( m_progress ) ;
2011-09-11 19:15:06 +02:00
p_QupZilla - > navigationBar ( ) - > showStopButton ( ) ;
2011-07-11 20:30:49 +02:00
}
2011-03-02 16:57:41 +01:00
}
void WebView : : loadStarted ( )
{
m_progress = 0 ;
m_isLoading = true ;
animationLoading ( tabIndex ( ) , true ) ;
if ( title ( ) . isNull ( ) )
tabWidget ( ) - > setTabText ( tabIndex ( ) , tr ( " Loading... " ) ) ;
m_currentIp . clear ( ) ;
// if (m_loadingTimer)
// delete m_loadingTimer;
// m_loadingTimer = new QTimer();
// connect(m_loadingTimer, SIGNAL(timeout()), this, SLOT(stopAnimation()));
// m_loadingTimer->start(1000*20); //20 seconds timeout to automatically "stop" loading animation
}
2011-03-17 17:03:04 +01:00
QLabel * WebView : : animationLoading ( int index , bool addMovie )
2011-03-02 16:57:41 +01:00
{
if ( - 1 = = index )
return 0 ;
2011-03-17 17:03:04 +01:00
QLabel * loadingAnimation = qobject_cast < QLabel * > ( tabWidget ( ) - > getTabBar ( ) - > tabButton ( index , QTabBar : : LeftSide ) ) ;
2011-03-02 16:57:41 +01:00
if ( ! loadingAnimation ) {
2011-03-26 13:34:08 +01:00
loadingAnimation = new QLabel ( ) ;
2011-09-11 19:15:06 +02:00
loadingAnimation - > setStyleSheet ( " margin: 0px; padding: 0px; width: 16px; height: 16px; " ) ;
2011-03-02 16:57:41 +01:00
}
if ( addMovie & & ! loadingAnimation - > movie ( ) ) {
2011-03-17 17:03:04 +01:00
QMovie * movie = new QMovie ( " :icons/other/progress.gif " , QByteArray ( ) , loadingAnimation ) ;
2011-03-02 16:57:41 +01:00
movie - > setSpeed ( 70 ) ;
loadingAnimation - > setMovie ( movie ) ;
movie - > start ( ) ;
}
else if ( loadingAnimation - > movie ( ) )
loadingAnimation - > movie ( ) - > stop ( ) ;
tabWidget ( ) - > getTabBar ( ) - > setTabButton ( index , QTabBar : : LeftSide , 0 ) ;
tabWidget ( ) - > getTabBar ( ) - > setTabButton ( index , QTabBar : : LeftSide , loadingAnimation ) ;
return loadingAnimation ;
}
void WebView : : stopAnimation ( )
{
//m_loadingTimer->stop();
QMovie * mov = animationLoading ( tabIndex ( ) , false ) - > movie ( ) ;
if ( mov ) {
mov - > stop ( ) ;
iconChanged ( ) ;
}
}
2011-04-24 09:08:53 +02:00
void WebView : : setIp ( const QHostInfo & info )
2011-03-02 16:57:41 +01:00
{
if ( info . addresses ( ) . isEmpty ( ) )
return ;
m_currentIp = info . hostName ( ) + " ( " + info . addresses ( ) . at ( 0 ) . toString ( ) + " ) " ;
if ( isCurrent ( ) )
emit ipChanged ( m_currentIp ) ;
}
void WebView : : loadFinished ( bool state )
{
Q_UNUSED ( state ) ;
2011-10-17 09:57:07 +02:00
if ( mApp - > isClosing ( ) )
return ;
2011-03-02 16:57:41 +01:00
if ( animationLoading ( tabIndex ( ) , false ) - > movie ( ) )
animationLoading ( tabIndex ( ) , false ) - > movie ( ) - > stop ( ) ;
2011-06-06 19:38:37 +02:00
2011-03-02 16:57:41 +01:00
m_isLoading = false ;
2011-10-15 18:08:52 +02:00
if ( m_lastUrl ! = url ( ) )
2011-03-10 16:23:53 +01:00
mApp - > history ( ) - > addHistoryEntry ( this ) ;
2011-10-15 18:08:52 +02:00
emit showUrl ( url ( ) ) ;
2011-03-02 16:57:41 +01:00
iconChanged ( ) ;
2011-03-10 16:23:53 +01:00
m_lastUrl = url ( ) ;
2011-03-02 16:57:41 +01:00
2011-09-11 19:15:06 +02:00
//Icon is sometimes not available at the moment of finished loading
2011-03-02 16:57:41 +01:00
if ( icon ( ) . isNull ( ) )
QTimer : : singleShot ( 1000 , this , SLOT ( iconChanged ( ) ) ) ;
2011-03-18 15:01:01 +01:00
titleChanged ( ) ;
2011-03-04 13:59:07 +01:00
mApp - > autoFill ( ) - > completePage ( this ) ;
2011-03-02 16:57:41 +01:00
QHostInfo : : lookupHost ( url ( ) . host ( ) , this , SLOT ( setIp ( QHostInfo ) ) ) ;
2011-07-11 20:30:49 +02:00
if ( isCurrent ( ) ) {
p_QupZilla - > progressBar ( ) - > setVisible ( false ) ;
2011-09-11 19:15:06 +02:00
p_QupZilla - > navigationBar ( ) - > showReloadButton ( ) ;
2011-07-11 20:30:49 +02:00
p_QupZilla - > ipLabel ( ) - > show ( ) ;
}
2011-08-23 17:49:21 +02:00
emit urlChanged ( url ( ) ) ;
2011-03-02 16:57:41 +01:00
}
2011-03-18 15:01:01 +01:00
void WebView : : titleChanged ( )
2011-03-02 16:57:41 +01:00
{
2011-03-18 15:01:01 +01:00
QString title_ = title ( ) ;
QString title2 = title_ ;
2011-03-02 16:57:41 +01:00
tabWidget ( ) - > setTabToolTip ( tabIndex ( ) , title2 ) ;
2011-10-15 16:37:32 +02:00
title2 + = " - QupZilla " ;
2011-03-02 16:57:41 +01:00
if ( isCurrent ( ) )
p_QupZilla - > setWindowTitle ( title2 ) ;
2011-10-15 16:37:32 +02:00
tabWidget ( ) - > setTabText ( tabIndex ( ) , title_ ) ;
2011-03-02 16:57:41 +01:00
}
void WebView : : iconChanged ( )
{
2011-09-11 19:15:06 +02:00
if ( mApp - > isClosing ( ) )
return ;
2011-10-15 16:37:32 +02:00
if ( isCurrent ( ) )
emit siteIconChanged ( ) ;
if ( m_isLoading )
return ;
2011-04-04 16:00:27 +02:00
QIcon icon_ = siteIcon ( ) ;
2011-03-02 16:57:41 +01:00
if ( ! icon_ . isNull ( ) )
animationLoading ( tabIndex ( ) , false ) - > setPixmap ( icon_ . pixmap ( 16 , 16 ) ) ;
else
2011-09-30 21:44:18 +02:00
animationLoading ( tabIndex ( ) , false ) - > setPixmap ( IconProvider : : fromTheme ( " text-plain " ) . pixmap ( 16 , 16 ) ) ;
2011-03-02 16:57:41 +01:00
}
2011-04-04 17:03:41 +02:00
QIcon WebView : : siteIcon ( )
{
if ( ! icon ( ) . isNull ( ) )
return icon ( ) ;
2011-04-05 18:45:17 +02:00
if ( ! m_siteIcon . isNull ( ) )
return m_siteIcon ;
2011-04-25 20:56:45 +02:00
return _iconForUrl ( url ( ) ) ;
2011-04-04 17:03:41 +02:00
}
2011-03-02 16:57:41 +01:00
void WebView : : linkHovered ( const QString & link , const QString & title , const QString & content )
{
Q_UNUSED ( title ) ;
Q_UNUSED ( content ) ;
if ( isCurrent ( ) ) {
2011-05-09 17:58:19 +02:00
if ( link ! = " " )
p_QupZilla - > statusBarMessage ( ) - > showMessage ( link ) ;
else
p_QupZilla - > statusBarMessage ( ) - > clearMessage ( ) ;
2011-03-02 16:57:41 +01:00
}
m_hoveredLink = link ;
}
TabWidget * WebView : : tabWidget ( ) const
{
2011-03-17 17:03:04 +01:00
QObject * widget = this - > parent ( ) ;
2011-03-02 16:57:41 +01:00
while ( widget ) {
2011-03-17 17:03:04 +01:00
if ( TabWidget * tw = qobject_cast < TabWidget * > ( widget ) )
2011-03-02 16:57:41 +01:00
return tw ;
widget = widget - > parent ( ) ;
}
return 0 ;
}
int WebView : : tabIndex ( ) const
{
TabWidget * tabWid = tabWidget ( ) ;
if ( ! tabWid )
return - 1 ;
int i = 0 ;
while ( qobject_cast < WebTab * > ( tabWid - > widget ( i ) ) - > view ( ) ! = this ) {
i + + ;
}
return i ;
}
QUrl WebView : : guessUrlFromString ( const QString & string )
{
QString trimmedString = string . trimmed ( ) ;
// Check the most common case of a valid url with scheme and host first
QUrl url = QUrl : : fromEncoded ( trimmedString . toUtf8 ( ) , QUrl : : TolerantMode ) ;
if ( url . isValid ( ) & & ! url . scheme ( ) . isEmpty ( ) & & ! url . host ( ) . isEmpty ( ) )
return url ;
// Absolute files that exists
if ( QDir : : isAbsolutePath ( trimmedString ) & & QFile : : exists ( trimmedString ) )
return QUrl : : fromLocalFile ( trimmedString ) ;
// If the string is missing the scheme or the scheme is not valid prepend a scheme
QString scheme = url . scheme ( ) ;
if ( scheme . isEmpty ( ) | | scheme . contains ( QLatin1Char ( ' . ' ) ) | | scheme = = QLatin1String ( " localhost " ) ) {
// Do not do anything for strings such as "foo", only "foo.com"
int dotIndex = trimmedString . indexOf ( QLatin1Char ( ' . ' ) ) ;
if ( dotIndex ! = - 1 | | trimmedString . startsWith ( QLatin1String ( " localhost " ) ) ) {
const QString hostscheme = trimmedString . left ( dotIndex ) . toLower ( ) ;
QByteArray scheme = ( hostscheme = = QLatin1String ( " ftp " ) ) ? " ftp " : " http " ;
trimmedString = QLatin1String ( scheme ) + QLatin1String ( " :// " ) + trimmedString ;
}
url = QUrl : : fromEncoded ( trimmedString . toUtf8 ( ) , QUrl : : TolerantMode ) ;
}
if ( url . isValid ( ) )
return url ;
return QUrl ( ) ;
}
2011-03-03 14:25:02 +01:00
void WebView : : checkRss ( )
{
QWebFrame * frame = page ( ) - > mainFrame ( ) ;
QWebElementCollection links = frame - > findAllElements ( " link " ) ;
m_rss . clear ( ) ;
for ( int i = 0 ; i < links . count ( ) ; i + + ) {
QWebElement element = links . at ( i ) ;
//We will show only atom+xml and rss+xml
if ( element . attribute ( " rel " ) ! = " alternate " | | ( element . attribute ( " type " ) ! = " application/rss+xml " & & element . attribute ( " type " ) ! = " application/atom+xml " ) )
continue ;
QString title = element . attribute ( " title " ) ;
QString href = element . attribute ( " href " ) ;
if ( href . isEmpty ( ) | | title . isEmpty ( ) )
continue ;
m_rss . append ( QPair < QString , QString > ( title , href ) ) ;
}
2011-07-11 20:30:49 +02:00
emit rssChanged ( ! m_rss . isEmpty ( ) ) ;
2011-03-03 14:25:02 +01:00
}
2011-03-17 17:03:04 +01:00
void WebView : : mousePressEvent ( QMouseEvent * event )
2011-03-02 16:57:41 +01:00
{
switch ( event - > button ( ) ) {
case Qt : : XButton1 :
back ( ) ;
break ;
case Qt : : XButton2 :
forward ( ) ;
break ;
case Qt : : MiddleButton :
if ( isUrlValid ( QUrl ( m_hoveredLink ) ) )
2011-03-16 18:35:31 +01:00
tabWidget ( ) - > addView ( QUrl : : fromEncoded ( m_hoveredLink . toAscii ( ) ) , tr ( " New tab " ) , TabWidget : : NewNotSelectedTab ) ;
2011-03-02 16:57:41 +01:00
break ;
case Qt : : LeftButton :
if ( event - > modifiers ( ) = = Qt : : ControlModifier & & isUrlValid ( QUrl ( m_hoveredLink ) ) ) {
2011-03-16 18:35:31 +01:00
tabWidget ( ) - > addView ( QUrl : : fromEncoded ( m_hoveredLink . toAscii ( ) ) , tr ( " New tab " ) , TabWidget : : NewNotSelectedTab ) ;
2011-03-02 16:57:41 +01:00
return ;
}
default :
QWebView : : mousePressEvent ( event ) ;
break ;
}
}
2011-05-22 10:47:03 +02:00
void WebView : : resizeEvent ( QResizeEvent * event )
{
QWebView : : resizeEvent ( event ) ;
emit viewportResized ( m_page - > viewportSize ( ) ) ;
}
2011-03-02 16:57:41 +01:00
void WebView : : mouseReleaseEvent ( QMouseEvent * event )
{
//Workaround for crash in mouseReleaseEvent when closing tab from javascript :/
if ( ! m_wantsClose )
QWebView : : mouseReleaseEvent ( event ) ;
}
2011-03-17 17:03:04 +01:00
void WebView : : keyPressEvent ( QKeyEvent * event )
2011-03-02 16:57:41 +01:00
{
switch ( event - > key ( ) ) {
case Qt : : Key_Back :
back ( ) ;
event - > accept ( ) ;
break ;
case Qt : : Key_Forward :
forward ( ) ;
event - > accept ( ) ;
break ;
case Qt : : Key_Stop :
stop ( ) ;
event - > accept ( ) ;
break ;
case Qt : : Key_Refresh :
reload ( ) ;
event - > accept ( ) ;
break ;
default :
QWebView : : keyPressEvent ( event ) ;
return ;
}
}
2011-04-22 07:45:15 +02:00
void WebView : : mouseMoveEvent ( QMouseEvent * event )
{
if ( m_mouseTrack ) {
if ( m_navigationVisible ) {
m_navigationVisible = false ;
p_QupZilla - > showNavigationWithFullscreen ( ) ;
} else if ( event - > y ( ) < 5 ) {
m_navigationVisible = true ;
p_QupZilla - > showNavigationWithFullscreen ( ) ;
}
}
QWebView : : mouseMoveEvent ( event ) ;
}
2011-03-17 17:03:04 +01:00
void WebView : : contextMenuEvent ( QContextMenuEvent * event )
2011-03-02 16:57:41 +01:00
{
2011-03-17 17:03:04 +01:00
QMenu * menu = new QMenu ( this ) ;
2011-03-02 16:57:41 +01:00
QWebHitTestResult r = page ( ) - > mainFrame ( ) - > hitTestContent ( event - > pos ( ) ) ;
2011-03-18 20:53:02 +01:00
if ( ! r . linkUrl ( ) . isEmpty ( ) & & r . linkUrl ( ) . scheme ( ) ! = " javascript " ) {
2011-03-02 16:57:41 +01:00
if ( page ( ) - > selectedText ( ) = = r . linkText ( ) )
findText ( " " ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon ( " :/icons/menu/popup.png " ) , tr ( " Open link in new &tab " ) , this , SLOT ( openUrlInNewTab ( ) ) ) - > setData ( r . linkUrl ( ) ) ;
menu - > addAction ( tr ( " Open link in new &window " ) , this , SLOT ( openUrlInNewWindow ( ) ) ) - > setData ( r . linkUrl ( ) ) ;
2011-03-02 16:57:41 +01:00
menu - > addSeparator ( ) ;
2011-09-30 21:44:18 +02:00
menu - > addAction ( IconProvider : : fromTheme ( " user-bookmarks " ) , tr ( " B&ookmark link " ) , this , SLOT ( bookmarkLink ( ) ) ) - > setData ( r . linkUrl ( ) ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon : : fromTheme ( " document-save " ) , tr ( " &Save link as... " ) , this , SLOT ( downloadLinkToDisk ( ) ) ) - > setData ( r . linkUrl ( ) ) ;
2011-03-02 16:57:41 +01:00
menu - > addAction ( tr ( " Send link... " ) , this , SLOT ( sendLinkByMail ( ) ) ) - > setData ( r . linkUrl ( ) ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon : : fromTheme ( " edit-copy " ) , tr ( " &Copy link address " ) , this , SLOT ( copyLinkToClipboard ( ) ) ) - > setData ( r . linkUrl ( ) ) ;
2011-03-02 16:57:41 +01:00
menu - > addSeparator ( ) ;
2011-07-19 22:04:08 +02:00
if ( ! selectedText ( ) . isEmpty ( ) )
2011-03-02 16:57:41 +01:00
menu - > addAction ( pageAction ( QWebPage : : Copy ) ) ;
}
if ( ! r . imageUrl ( ) . isEmpty ( ) ) {
if ( ! menu - > isEmpty ( ) )
menu - > addSeparator ( ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( tr ( " Show i&mage " ) , this , SLOT ( showImage ( ) ) ) - > setData ( r . imageUrl ( ) ) ;
menu - > addAction ( tr ( " Copy im&age " ) , this , SLOT ( copyImageToClipboard ( ) ) ) - > setData ( r . imageUrl ( ) ) ;
menu - > addAction ( QIcon : : fromTheme ( " edit-copy " ) , tr ( " Copy image ad&dress " ) , this , SLOT ( copyLinkToClipboard ( ) ) ) - > setData ( r . imageUrl ( ) ) ;
2011-03-02 16:57:41 +01:00
menu - > addSeparator ( ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon : : fromTheme ( " document-save " ) , tr ( " &Save image as... " ) , this , SLOT ( downloadImageToDisk ( ) ) ) - > setData ( r . imageUrl ( ) ) ;
2011-03-02 16:57:41 +01:00
menu - > addAction ( tr ( " Send image... " ) , this , SLOT ( sendLinkByMail ( ) ) ) - > setData ( r . linkUrl ( ) ) ;
menu - > addSeparator ( ) ;
//menu->addAction(tr("Block image"), this, SLOT(blockImage()))->setData(r.imageUrl().toString());
2011-07-19 22:04:08 +02:00
if ( ! selectedText ( ) . isEmpty ( ) )
2011-03-02 16:57:41 +01:00
menu - > addAction ( pageAction ( QWebPage : : Copy ) ) ;
}
QWebElement element = r . element ( ) ;
if ( ! element . isNull ( ) & & ( element . tagName ( ) . toLower ( ) = = " input " | | element . tagName ( ) . toLower ( ) = = " textarea " ) ) {
if ( menu - > isEmpty ( ) ) {
delete menu ;
menu = page ( ) - > createStandardContextMenu ( ) ;
}
}
if ( menu - > isEmpty ( ) ) {
2011-04-09 00:22:50 +02:00
QAction * action = menu - > addAction ( tr ( " &Back " ) , this , SLOT ( back ( ) ) ) ;
2011-09-30 21:44:18 +02:00
action - > setIcon ( IconProvider : : standardIcon ( QStyle : : SP_ArrowBack ) ) ;
2011-03-02 16:57:41 +01:00
history ( ) - > canGoBack ( ) ? action - > setEnabled ( true ) : action - > setEnabled ( false ) ;
2011-04-09 00:22:50 +02:00
action = menu - > addAction ( tr ( " &Forward " ) , this , SLOT ( forward ( ) ) ) ;
2011-09-30 21:44:18 +02:00
action - > setIcon ( IconProvider : : standardIcon ( QStyle : : SP_ArrowForward ) ) ;
2011-03-02 16:57:41 +01:00
history ( ) - > canGoForward ( ) ? action - > setEnabled ( true ) : action - > setEnabled ( false ) ;
2011-09-30 21:44:18 +02:00
menu - > addAction ( IconProvider : : standardIcon ( QStyle : : SP_BrowserReload ) , tr ( " &Reload " ) , this , SLOT ( slotReload ( ) ) ) ;
action = menu - > addAction ( IconProvider : : standardIcon ( QStyle : : SP_BrowserStop ) , tr ( " S&top " ) , this , SLOT ( stop ( ) ) ) ;
2011-03-02 16:57:41 +01:00
isLoading ( ) ? action - > setEnabled ( true ) : action - > setEnabled ( false ) ;
menu - > addSeparator ( ) ;
2011-09-30 21:44:18 +02:00
menu - > addAction ( IconProvider : : fromTheme ( " user-bookmarks " ) , tr ( " Book&mark page " ) , this , SLOT ( bookmarkLink ( ) ) ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon : : fromTheme ( " document-save " ) , tr ( " &Save page as... " ) , this , SLOT ( downloadLinkToDisk ( ) ) ) - > setData ( url ( ) ) ;
2011-03-02 16:57:41 +01:00
menu - > addAction ( tr ( " Send page... " ) , this , SLOT ( sendLinkByMail ( ) ) ) - > setData ( url ( ) ) ;
menu - > addSeparator ( ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon : : fromTheme ( " edit-select-all " ) , tr ( " Select &all " ) , this , SLOT ( selectAll ( ) ) ) ;
2011-07-19 22:04:08 +02:00
if ( ! selectedText ( ) . isEmpty ( ) )
2011-03-02 16:57:41 +01:00
menu - > addAction ( pageAction ( QWebPage : : Copy ) ) ;
menu - > addSeparator ( ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon : : fromTheme ( " text-html " ) , tr ( " Show so&urce code " ) , this , SLOT ( showSource ( ) ) ) ;
menu - > addAction ( QIcon : : fromTheme ( " dialog-information " ) , tr ( " Show info ab&out site " ) , this , SLOT ( showSiteInfo ( ) ) ) - > setData ( url ( ) ) ;
menu - > addAction ( tr ( " Show Web &Inspector " ) , this , SLOT ( showInspector ( ) ) ) ;
2011-03-02 16:57:41 +01:00
}
2011-03-04 13:59:07 +01:00
mApp - > plugins ( ) - > populateWebViewMenu ( menu , this , r ) ;
2011-03-02 16:57:41 +01:00
2011-07-19 22:04:08 +02:00
if ( ! selectedText ( ) . isEmpty ( ) ) {
2011-03-02 16:57:41 +01:00
menu - > addSeparator ( ) ;
QString selectedText = page ( ) - > selectedText ( ) ;
selectedText . truncate ( 20 ) ;
2011-04-09 00:22:50 +02:00
menu - > addAction ( QIcon ( " :icons/menu/google.png " ) , tr ( " Search \" %1 .. \" on &Google " ) . arg ( selectedText ) , this , SLOT ( searchOnGoogle ( ) ) ) - > setData ( page ( ) - > selectedText ( ) ) ;
2011-03-02 16:57:41 +01:00
}
2011-07-19 22:04:08 +02:00
# if QT_VERSION == 0x040800
// if (!selectedHtml().isEmpty())
// menu->addAction(tr("Show source of selection"), this, SLOT(showSourceOfSelection()));
# endif
2011-03-02 16:57:41 +01:00
if ( ! menu - > isEmpty ( ) ) {
//Prevent choosing first option with double rightclick
QPoint pos = QCursor : : pos ( ) ;
QPoint p ( pos . x ( ) , pos . y ( ) + 1 ) ;
menu - > exec ( p ) ;
delete menu ;
return ;
}
QWebView : : contextMenuEvent ( event ) ;
}
2011-07-21 17:16:53 +02:00
void WebView : : stop ( )
{
if ( page ( ) ) {
emit ipChanged ( m_currentIp ) ;
page ( ) - > triggerAction ( QWebPage : : Stop ) ;
loadFinished ( true ) ;
if ( m_locationBar - > text ( ) . isEmpty ( ) )
m_locationBar - > setText ( url ( ) . toEncoded ( ) ) ;
}
}
2011-03-17 17:03:04 +01:00
void WebView : : addNotification ( QWidget * notif )
2011-03-02 16:57:41 +01:00
{
emit showNotification ( notif ) ;
}
void WebView : : openUrlInNewTab ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-02 16:57:41 +01:00
tabWidget ( ) - > addView ( action - > data ( ) . toUrl ( ) , tr ( " New tab " ) , TabWidget : : NewNotSelectedTab ) ;
}
}
void WebView : : openUrlInNewWindow ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-04 13:59:07 +01:00
mApp - > makeNewWindow ( false , action - > data ( ) . toString ( ) ) ;
2011-03-02 16:57:41 +01:00
}
}
void WebView : : sendLinkByMail ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-02 16:57:41 +01:00
QDesktopServices : : openUrl ( QUrl ( " mailto:?body= " + action - > data ( ) . toString ( ) ) ) ;
}
}
void WebView : : copyLinkToClipboard ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-02 16:57:41 +01:00
QApplication : : clipboard ( ) - > setText ( action - > data ( ) . toString ( ) ) ;
}
}
void WebView : : searchOnGoogle ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-02 16:57:41 +01:00
load ( QUrl ( " http://www.google.com/search?client=qupzilla&q= " + action - > data ( ) . toString ( ) ) ) ;
}
}
void WebView : : selectAll ( )
{
triggerPageAction ( QWebPage : : SelectAll ) ;
}
void WebView : : downloadImageToDisk ( )
{
2011-03-24 22:31:38 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
DownloadManager * dManager = mApp - > downManager ( ) ;
QNetworkRequest request ( action - > data ( ) . toUrl ( ) ) ;
dManager - > download ( request , false ) ;
}
2011-03-02 16:57:41 +01:00
}
void WebView : : copyImageToClipboard ( )
{
triggerPageAction ( QWebPage : : CopyImageToClipboard ) ;
}
void WebView : : showImage ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-02 16:57:41 +01:00
load ( QUrl ( action - > data ( ) . toString ( ) ) ) ;
}
}
void WebView : : showSource ( )
{
p_QupZilla - > showSource ( ) ;
}
2011-08-19 15:57:51 +02:00
# if QT_VERSION == 0x040800
2011-07-19 22:04:08 +02:00
void WebView : : showSourceOfSelection ( )
{
p_QupZilla - > showSource ( selectedHtml ( ) ) ;
}
2011-08-19 15:57:51 +02:00
# endif
2011-07-19 22:04:08 +02:00
2011-03-02 16:57:41 +01:00
void WebView : : downloadLinkToDisk ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-02 16:57:41 +01:00
QNetworkRequest request ( action - > data ( ) . toUrl ( ) ) ;
2011-03-04 13:59:07 +01:00
DownloadManager * dManager = mApp - > downManager ( ) ;
2011-03-24 22:31:38 +01:00
dManager - > download ( request , false ) ;
2011-03-02 16:57:41 +01:00
}
}
void WebView : : downloadRequested ( const QNetworkRequest & request )
{
2011-03-04 13:59:07 +01:00
DownloadManager * dManager = mApp - > downManager ( ) ;
2011-03-02 16:57:41 +01:00
dManager - > download ( request ) ;
}
void WebView : : bookmarkLink ( )
{
2011-03-17 17:03:04 +01:00
if ( QAction * action = qobject_cast < QAction * > ( sender ( ) ) ) {
2011-03-02 16:57:41 +01:00
if ( action - > data ( ) . isNull ( ) )
p_QupZilla - > bookmarkPage ( ) ;
else
2011-07-30 17:57:14 +02:00
p_QupZilla - > addBookmark ( action - > data ( ) . toUrl ( ) , action - > data ( ) . toString ( ) , siteIcon ( ) ) ;
2011-03-02 16:57:41 +01:00
}
}
void WebView : : showInspector ( )
{
2011-10-14 20:14:57 +02:00
p_QupZilla - > showWebInspector ( ) ;
2011-03-02 16:57:41 +01:00
}
void WebView : : showSiteInfo ( )
{
p_QupZilla - > showPageInfo ( ) ;
}
void WebView : : applyZoom ( )
{
setZoomFactor ( qreal ( m_currentZoom ) / 100.0 ) ;
}
void WebView : : zoomIn ( )
{
int i = m_zoomLevels . indexOf ( m_currentZoom ) ;
if ( i < m_zoomLevels . count ( ) - 1 )
m_currentZoom = m_zoomLevels [ i + 1 ] ;
applyZoom ( ) ;
}
void WebView : : zoomOut ( )
{
int i = m_zoomLevels . indexOf ( m_currentZoom ) ;
if ( i > 0 )
m_currentZoom = m_zoomLevels [ i - 1 ] ;
applyZoom ( ) ;
}
void WebView : : zoomReset ( )
{
m_currentZoom = 100 ;
applyZoom ( ) ;
}
2011-03-17 17:03:04 +01:00
void WebView : : wheelEvent ( QWheelEvent * event )
2011-03-02 16:57:41 +01:00
{
if ( event - > modifiers ( ) & Qt : : ControlModifier ) {
int numDegrees = event - > delta ( ) / 8 ;
int numSteps = numDegrees / 15 ;
if ( numSteps = = 1 )
zoomIn ( ) ;
else
zoomOut ( ) ;
event - > accept ( ) ;
return ;
}
2011-05-22 10:47:03 +02:00
if ( m_mouseWheelEnabled )
QWebView : : wheelEvent ( event ) ;
2011-03-02 16:57:41 +01:00
}
void WebView : : getFocus ( const QUrl & urla )
{
if ( urla = = url ( ) )
tabWidget ( ) - > setCurrentWidget ( this ) ;
}
void WebView : : closeTab ( )
{
if ( m_wantsClose )
emit wantsCloseTab ( tabIndex ( ) ) ;
else {
m_wantsClose = true ;
QTimer : : singleShot ( 20 , this , SLOT ( closeTab ( ) ) ) ;
}
}
2011-04-24 09:08:53 +02:00
void WebView : : load ( const QUrl & url )
2011-03-02 16:57:41 +01:00
{
2011-09-18 15:35:44 +02:00
if ( url . scheme ( ) = = " javascript " ) {
2011-03-02 16:57:41 +01:00
page ( ) - > mainFrame ( ) - > evaluateJavaScript ( url . toString ( ) ) ;
return ;
}
if ( isUrlValid ( url ) ) {
QWebView : : load ( url ) ;
m_aboutToLoadUrl = url ;
return ;
}
# ifdef Q_WS_WIN
if ( QFile : : exists ( url . path ( ) . mid ( 1 ) ) ) // From QUrl(file:///C:/Bla/ble/foo.html it returns
// /C:/Bla/ble/foo.html ... so we cut first char
# else
if ( QFile : : exists ( url . path ( ) ) )
# endif
QWebView : : load ( url ) ;
2011-10-01 17:55:10 +02:00
else {
QString urlString = " http://www.google.com/search?client=qupzilla&q= " + url . toString ( ) ;
QWebView : : load ( QUrl ( urlString ) ) ;
m_locationBar - > setText ( urlString ) ;
}
2011-03-02 16:57:41 +01:00
}
QUrl WebView : : url ( ) const
{
QUrl ur = QWebView : : url ( ) ;
if ( ur . isEmpty ( ) & & ! m_aboutToLoadUrl . isEmpty ( ) )
return m_aboutToLoadUrl ;
return ur ;
}
QString WebView : : title ( ) const
{
QString title = QWebView : : title ( ) ;
2011-03-18 15:01:01 +01:00
if ( title . isEmpty ( ) ) title = url ( ) . host ( ) ;
2011-03-19 13:15:01 +01:00
if ( title . isEmpty ( ) ) title = url ( ) . path ( ) ;
2011-03-02 16:57:41 +01:00
if ( title . isEmpty ( ) )
return tr ( " No Named Page " ) ;
return title ;
}
void WebView : : reload ( )
{
if ( QWebView : : url ( ) . isEmpty ( ) & & ! m_aboutToLoadUrl . isEmpty ( ) ) {
2011-09-18 15:35:44 +02:00
// qDebug() << "loading about to load";
2011-03-02 16:57:41 +01:00
load ( m_aboutToLoadUrl ) ;
return ;
}
QWebView : : reload ( ) ;
}
bool WebView : : isUrlValid ( const QUrl & url )
{
2011-09-18 15:35:44 +02:00
if ( url . scheme ( ) = = " qupzilla " )
return true ;
2011-03-02 16:57:41 +01:00
if ( url . isValid ( ) & & ! url . host ( ) . isEmpty ( ) & & ! url . scheme ( ) . isEmpty ( ) )
return true ;
return false ;
}
WebView : : ~ WebView ( )
{
history ( ) - > clear ( ) ;
delete m_page ;
}