33 #include "ui_htmlpageinfo.h"
44 #include "html/html_documentimpl.h"
45 #include "html/html_baseimpl.h"
46 #include "html/html_objectimpl.h"
47 #include "html/html_miscimpl.h"
48 #include "html/html_imageimpl.h"
49 #include "imload/imagemanager.h"
50 #include "rendering/render_text.h"
51 #include "rendering/render_frames.h"
52 #include "rendering/render_layer.h"
53 #include "rendering/render_position.h"
54 #include "misc/loader.h"
55 #include "misc/khtml_partaccessor.h"
56 #include "xml/dom2_eventsimpl.h"
57 #include "xml/dom2_rangeimpl.h"
58 #include "xml/xml_tokenizer.h"
59 #include "css/cssstyleselector.h"
60 #include "css/csshelper.h"
67 #include "ecma/kjs_proxy.h"
68 #include "ecma/kjs_window.h"
72 #include <kjs/function.h>
73 #include <kjs/interpreter.h>
75 #include <sys/types.h>
105 #include <kde_file.h>
119 #include <QtGui/QClipboard>
120 #include <QtGui/QToolTip>
121 #include <QtCore/QFile>
122 #include <QtCore/QMetaEnum>
123 #include <QtGui/QTextDocument>
124 #include <QtCore/QDate>
125 #include <QtNetwork/QSslCertificate>
131 #include "rendering/render_form.h"
135 #include "ecma/debugger/debugwindow.h"
157 m_cachedSheet = dl->requestStyleSheet(url,
QString(),
"text/css",
160 m_cachedSheet->ref(
this );
162 virtual ~PartStyleSheetLoader()
164 if ( m_cachedSheet ) m_cachedSheet->deref(
this);
173 virtual void error(
int,
const QString& ) {
176 QPointer<KHTMLPart> m_part;
177 khtml::CachedCSSStyleSheet *m_cachedSheet;
187 init(
new KHTMLView(
this, parentWidget ), prof );
198 view->setPart(
this );
202 void KHTMLPart::init(
KHTMLView *view, GUIProfile prof )
215 widget->setObjectName(
"khtml_part_widget");
216 QVBoxLayout *layout =
new QVBoxLayout( widget );
217 layout->setContentsMargins( 0, 0, 0, 0 );
218 layout->setSpacing( 0 );
219 widget->setLayout( layout );
225 layout->addWidget( d->
m_view );
228 widget->setFocusProxy( d->
m_view );
235 d->
m_extension->setObjectName(
"KHTMLBrowserExtension" );
253 connect( d->
m_paViewDocument, SIGNAL(triggered(
bool)),
this, SLOT(slotViewDocumentSource()) );
260 connect( d->
m_paViewFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotViewFrameSource()) );
270 connect( d->
m_paViewInfo, SIGNAL(triggered(
bool)),
this, SLOT(slotViewPageInfo()) );
274 connect( d->
m_paSaveBackground, SIGNAL(triggered(
bool)),
this, SLOT(slotSaveBackground()) );
277 this, SLOT(slotSaveDocument()) );
283 connect( d->
m_paSaveFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotSaveFrame()) );
295 connect( d->
m_paSecurity, SIGNAL(triggered(
bool)),
this, SLOT(slotSecurity()) );
299 connect( d->
m_paDebugRenderTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugRenderTree()) );
303 connect( d->
m_paDebugDOMTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugDOMTree()) );
305 KAction* paDebugFrameTree =
new KAction(
i18n(
"Print frame tree to STDOUT" ),
this );
307 connect( paDebugFrameTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugFrameTree()) );
311 connect( d->
m_paStopAnimations, SIGNAL(triggered(
bool)),
this, SLOT(slotStopAnimations()) );
327 if (name.endsWith(
"1251")||name.startsWith(
"koi")||name==
"iso-8859-5")
329 else if (name.endsWith(
"1256")||name==
"iso-8859-6")
331 else if (name.endsWith(
"1257")||name==
"iso-8859-13"||name==
"iso-8859-4")
333 else if (name.endsWith(
"1250")|| name==
"ibm852" || name==
"iso-8859-2" || name==
"iso-8859-3" )
335 else if (name.endsWith(
"1253")|| name==
"iso-8859-7" )
337 else if (name.endsWith(
"1255")|| name==
"iso-8859-8" || name==
"iso-8859-8-i" )
339 else if (name==
"jis7" || name==
"eucjp" || name==
"sjis" )
341 else if (name.endsWith(
"1254")|| name==
"iso-8859-9" )
343 else if (name.endsWith(
"1252")|| name==
"iso-8859-1" || name==
"iso-8859-15" )
354 connect( d->
m_paUseStylesheet, SIGNAL(triggered(
int)),
this, SLOT(slotUseStylesheet()) );
359 connect(d->
m_paIncZoomFactor, SIGNAL(triggered(
bool)), SLOT(slotIncFontSizeFast()));
361 "Make the font in this window bigger. "
362 "Click and hold down the mouse button for a menu with all available font sizes.</qt>" ) );
366 connect(d->
m_paDecZoomFactor, SIGNAL(triggered(
bool)), SLOT(slotDecFontSizeFast()));
368 "Make the font in this window smaller. "
369 "Click and hold down the mouse button for a menu with all available font sizes.</qt>" ) );
382 d->
m_paFind->setWhatsThis(
i18n(
"<qt>Find text<br /><br />"
383 "Shows a dialog that allows you to find text on the displayed page.</qt>" ) );
387 "Find the next occurrence of the text that you "
388 "have found using the <b>Find Text</b> function.</qt>" ) );
391 this, SLOT(slotFindPrev()) );
393 "Find the previous occurrence of the text that you "
394 "have found using the <b>Find Text</b> function.</qt>" ) );
400 d->
m_paFindAheadText->
setHelpText(
i18n(
"This shortcut shows the find bar, for finding text in the displayed page. It cancels the effect of \"Find Links as You Type\", which sets the \"Find links only\" option."));
401 connect( d->
m_paFindAheadText, SIGNAL(triggered(
bool)),
this, SLOT(slotFindAheadText()) );
410 connect( d->
m_paFindAheadLinks, SIGNAL(triggered(
bool)),
this, SLOT(slotFindAheadLink()) );
424 connect( d->
m_paPrintFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotPrintFrame()) );
426 "Some pages have several frames. To print only a single frame, click "
427 "on it and then use this function.</qt>" ) );
435 this, SLOT(slotSelectAll()) );
442 connect( d->
m_paToggleCaretMode, SIGNAL(triggered(
bool)),
this, SLOT(slotToggleCaretMode()) );
483 action->setShortcutContext ( Qt::WidgetWithChildrenShortcut );
487 connect( view, SIGNAL(zoomView(
int)), SLOT(slotZoomView(
int)) );
490 this, SLOT(updateActions()) );
492 this, SLOT(updateActions()) );
494 this, SLOT(updateActions()) );
499 connect( khtml::Cache::loader(), SIGNAL(requestStarted(khtml::DocLoader*,khtml::CachedObject*)),
500 this, SLOT(slotLoaderRequestStarted(khtml::DocLoader*,khtml::CachedObject*)) );
501 connect( khtml::Cache::loader(), SIGNAL(requestDone(khtml::DocLoader*,khtml::CachedObject*)),
502 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
503 connect( khtml::Cache::loader(), SIGNAL(requestFailed(khtml::DocLoader*,khtml::CachedObject*)),
504 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
511 this, SLOT(slotRedirect()) );
513 if (QDBusConnection::sessionBus().isConnected()) {
515 for (
int i = 1; ; ++i)
516 if (QDBusConnection::sessionBus().registerObject(
QString(
"/KHTML/%1/widget").arg(i),
this))
518 else if (i == 0xffff)
519 kFatal() <<
"Something is very wrong in KHTMLPart!";
544 removeJSErrorExtension();
553 disconnect( khtml::Cache::loader(), SIGNAL(requestStarted(khtml::DocLoader*,khtml::CachedObject*)),
554 this, SLOT(slotLoaderRequestStarted(khtml::DocLoader*,khtml::CachedObject*)) );
555 disconnect( khtml::Cache::loader(), SIGNAL(requestDone(khtml::DocLoader*,khtml::CachedObject*)),
556 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
557 disconnect( khtml::Cache::loader(), SIGNAL(requestFailed(khtml::DocLoader*,khtml::CachedObject*)),
558 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
576 d->
m_frame->m_run.data()->abort();
581 bool KHTMLPart::restoreURL(
const KUrl &url )
610 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
611 connect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
624 if (url.
protocol() == QLatin1String(
"help"))
646 kDebug( 6050 ) <<
this <<
"opening" <<
url;
674 if ( !urls.isEmpty() ) {
675 const KUrl mainURL = urls.first();
676 int error = mainURL.
queryItem(
"error" ).toInt();
695 d->
m_statusBarUALabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum));
719 bool isFrameSet =
false;
720 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
721 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
722 isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
729 for (; it !=
end; ++it) {
744 if ( url.
hasRef() && !isFrameSet )
746 bool noReloadForced = !args.reload() && !browserArgs.redirectedRequest() && !browserArgs.doPost();
749 kDebug( 6050 ) <<
"jumping to anchor. m_url = " <<
url;
758 d->
m_doc->setParsing(
false);
760 kDebug( 6050 ) <<
"completed...";
769 args.setXOffset( d->
m_view->contentsX() );
770 args.setYOffset( d->
m_view->contentsY() );
778 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
779 connect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
790 begin(url, args.xOffset(), args.yOffset());
791 write(QString::fromLatin1(
"<html><head></head><body>"));
793 write(QString::fromLatin1(
"<img "));
795 write(QString::fromLatin1(
"<embed "));
796 write(QString::fromLatin1(
"src=\""));
801 write(QString::fromLatin1(
"\">"));
810 if(url.
protocol().startsWith(
"http" ) && !url.host().isEmpty() &&
811 url.
path().isEmpty()) {
818 metaData.insert(
"main_frame_request",
parentPart() == 0 ?
"TRUE" :
"FALSE" );
821 metaData.insert(
"PropagateHttpHeader",
"true");
822 metaData.insert(
"ssl_was_in_use", d->
m_ssl_in_use ?
"TRUE" :
"FALSE" );
823 metaData.insert(
"ssl_activate_warnings",
"TRUE" );
831 else if (args.reload() && !browserArgs.softReload)
836 if ( browserArgs.doPost() && (url.
protocol().startsWith(
"http")) )
851 connect( d->
m_job, SIGNAL(result(
KJob*)),
854 SLOT(slotData(
KIO::Job*,QByteArray)) );
876 connect( d->
m_job, SIGNAL(speed(
KJob*,ulong)),
877 this, SLOT(slotJobSpeed(
KJob*,ulong)) );
879 connect( d->
m_job, SIGNAL(percent(
KJob*,ulong)),
880 this, SLOT(slotJobPercent(
KJob*,ulong)) );
882 connect( d->
m_job, SIGNAL(result(
KJob*)),
883 this, SLOT(slotJobDone(
KJob*)) );
892 connect( job, SIGNAL(result(
KJob*)),
893 this, SLOT(slotUserSheetStatDone(
KJob*)) );
910 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
911 HTMLDocumentImpl* hdoc =
static_cast<HTMLDocumentImpl*
>( d->
m_doc );
914 hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT,
false,
false );
916 d->
m_doc->updateRendering();
925 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
930 kDebug( 6050 ) <<
" was still parsing... calling end ";
931 slotFinishedParsing();
932 d->
m_doc->setParsing(
false);
938 kDebug( 6050 ) <<
"Aborted before starting to render, reverting location bar to " <<
url().
prettyUrl();
945 khtml::Cache::loader()->cancelRequests( d->
m_doc->docLoader() );
951 for (; it !=
end; ++it )
954 (*it)->m_run.data()->abort();
955 if ( !( *it )->m_part.isNull() )
956 ( *it )->m_part.data()->closeUrl();
963 for (; it !=
end; ++it)
965 if ( !( *it )->m_part.isNull() )
966 ( *it )->m_part.data()->closeUrl();
978 d->
m_view->closeChildDialogs();
986 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
988 return static_cast<HTMLDocumentImpl*
>(0);
1001 QByteArray sourceArray;
1002 QDataStream dataStream( &sourceArray, QIODevice::WriteOnly );
1004 QTextStream stream( sourceArray, QIODevice::ReadOnly );
1005 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1006 sourceStr = stream.readAll();
1013 if ( f.open( QIODevice::ReadOnly ) )
1015 QTextStream stream( &f );
1016 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1017 sourceStr = stream.readAll();
1045 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1052 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1065 if (!proxy || proxy->paused())
1068 return proxy->interpreter();
1079 d->
m_frame->m_jscript->clear();
1117 KJSProxy *KHTMLPart::jScript()
1129 for (; it !=
end; ++it)
1130 if ((*it)->m_part.data() ==
this) {
1149 QString trg = target.toLower();
1151 if (target ==
"_top") {
1155 else if (target ==
"_parent") {
1159 else if (target ==
"_self" || target ==
"_blank") {
1169 if (destpart ==
this)
1173 if (destpart->checkFrameAccess(
this))
1206 d->
m_jsedlg->_clear->setIcon(
KIcon(
"edit-clear-locationbar-ltr"));
1213 void KHTMLPart::removeJSErrorExtension() {
1227 void KHTMLPart::disableJSErrorExtension() {
1228 removeJSErrorExtension();
1237 void KHTMLPart::jsErrorDialogContextMenu() {
1239 m->addAction(
i18n(
"&Hide Errors"),
this, SLOT(removeJSErrorExtension()));
1240 m->addAction(
i18n(
"&Disable Error Reporting"),
this, SLOT(disableJSErrorExtension()));
1241 m->popup(QCursor::pos());
1244 void KHTMLPart::launchJSErrorDialog() {
1252 void KHTMLPart::launchJSConfigDialog() {
1254 args <<
"khtml_java_js";
1262 kDebug(6070) <<
"executeScript: caller='" << objectName() <<
"' filename=" << filename <<
" baseLine=" << baseLine ;
1266 if (!proxy || proxy->paused())
1270 (void)proxy->interpreter();
1272 KJS::Completion comp;
1274 QVariant ret = proxy->evaluate(filename, baseLine, script, n, &comp);
1279 if (comp.complType() == KJS::Throw && comp.value()) {
1282 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1283 proxy->interpreter()->globalExec(), comp.value());
1285 Qt::escape(filename), Qt::escape(msg)));
1292 kDebug(6070) <<
"executeScript done, handling immediate redirection NOW";
1294 khtml::Tokenizer* t = d->
m_doc->tokenizer();
1316 if (!proxy || proxy->paused())
1318 (void)proxy->interpreter();
1321 KJS::Completion comp;
1322 const QVariant ret = proxy->evaluate(
QString(), 1, script, n, &comp );
1328 if (comp.complType() == KJS::Throw && comp.value()) {
1331 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1332 proxy->interpreter()->globalExec(), comp.value());
1333 dlg->
addError(
i18n(
"<qt><b>Error</b>: node %1: %2</qt>",
1383 void KHTMLPart::slotDebugDOMTree()
1386 qDebug(
"%s", d->
m_doc->toString().string().toLatin1().constData());
1394 for (; it !=
end; ++it )
1395 if ( !( *it )->m_part.isNull() && (*it)->m_part.data()->inherits(
"KHTMLPart" ) ) {
1398 static_cast<KHTMLPart*
>( p )->slotDebugDOMTree();
1403 void KHTMLPart::slotDebugScript()
1406 jScript()->showDebugWindow();
1409 void KHTMLPart::slotDebugRenderTree()
1413 d->
m_doc->renderer()->printTree();
1424 void KHTMLPart::slotDebugFrameTree()
1429 void KHTMLPart::slotStopAnimations()
1436 if ( d->
m_doc && d->
m_doc->docLoader()->autoloadImages() == enable )
1440 d->
m_doc->docLoader()->setAutoloadImages( enable );
1452 connect( d->
m_paLoadImages, SIGNAL(triggered(
bool)),
this, SLOT(slotLoadImages()) );
1465 return d->
m_doc->docLoader()->autoloadImages();
1470 void KHTMLPart::clear()
1482 for(; it !=
end; ++it )
1486 (*it)->m_run.data()->abort();
1493 for(; it !=
end; ++it )
1497 (*it)->m_run.data()->abort();
1508 if (d->
m_doc->attached())
1514 d->
m_frame->m_jscript->clear();
1517 if (d->
m_doc && d->
m_doc->renderer() && d->
m_doc->renderer()->layer())
1518 d->
m_doc->renderer()->layer()->suspendMarquees();
1545 for(; it !=
end; ++it )
1547 if ( (*it)->m_part )
1550 delete (*it)->m_part.data();
1564 for (; oi != oiEnd; ++oi )
1566 delete (*oi)->m_part.data();
1588 #ifndef QT_NO_CLIPBOARD
1589 connect( qApp->clipboard(), SIGNAL(
selectionChanged()), SLOT(slotClearSelection()));
1617 DOM::HTMLDocumentImpl *KHTMLPart::docImpl()
const
1619 if ( d && d->
m_doc && d->
m_doc->isHTMLDocument() )
1620 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
1624 DOM::DocumentImpl *KHTMLPart::xmlDocImpl()
const
1631 void KHTMLPart::slotInfoMessage(
KJob* kio_job,
const QString& msg)
1638 setStatusBarText(msg, BarDefaultText);
1646 void KHTMLPart::slotData(
KIO::Job* kio_job,
const QByteArray &data )
1682 d->
m_doc->docLoader()->setCacheCreationDate(cacheCreationDate);
1718 if( !qData.isEmpty())
1719 d->
m_doc->processHttpEquiv(
"refresh", qData);
1731 if (!language.isEmpty())
1732 d->
m_doc->setContentLanguage(language);
1734 if ( !
url().isLocalFile() )
1744 write( data.data(), data.size() );
1747 void KHTMLPart::slotRestoreData(
const QByteArray &data )
1763 write( data.data(), data.size() );
1765 if (data.size() == 0)
1793 kDebug(6050) <<
"errorCode" << errorCode <<
"text" << text;
1801 QString errorName, techName, description;
1805 QDataStream stream(raw);
1807 stream >> errorName >> techName >> description >> causes >> solutions;
1813 url = Qt::escape( Qt::escape( reqUrl.
prettyUrl() ) );
1819 QFile file( filename );
1820 bool isOpened = file.open( QIODevice::ReadOnly );
1822 kWarning(6050) <<
"Could not open error html template:" << filename;
1826 html.replace( QLatin1String(
"TITLE" ),
i18n(
"Error: %1 - %2", errorName, url ) );
1827 html.replace( QLatin1String(
"DIRECTION" ), QApplication::isRightToLeft() ?
"rtl" :
"ltr" );
1830 QString doc = QLatin1String(
"<h1>" );
1831 doc +=
i18n(
"The requested operation could not be completed" );
1832 doc += QLatin1String(
"</h1><h2>" );
1834 doc += QLatin1String(
"</h2>" );
1835 if ( !techName.isNull() ) {
1836 doc += QLatin1String(
"<h2>" );
1837 doc +=
i18n(
"Technical Reason: " );
1839 doc += QLatin1String(
"</h2>" );
1841 doc += QLatin1String(
"<br clear=\"all\">" );
1842 doc += QLatin1String(
"<h3>" );
1843 doc +=
i18n(
"Details of the Request:" );
1844 doc += QLatin1String(
"</h3><ul><li>" );
1845 doc +=
i18n(
"URL: %1" , url );
1846 doc += QLatin1String(
"</li><li>" );
1847 if ( !protocol.isNull() ) {
1848 doc +=
i18n(
"Protocol: %1", protocol );
1849 doc += QLatin1String(
"</li><li>" );
1851 doc +=
i18n(
"Date and Time: %1" , datetime );
1852 doc += QLatin1String(
"</li><li>" );
1853 doc +=
i18n(
"Additional Information: %1" , text );
1854 doc += QLatin1String(
"</li></ul><h3>" );
1855 doc +=
i18n(
"Description:" );
1856 doc += QLatin1String(
"</h3><p>" );
1858 doc += QLatin1String(
"</p>" );
1859 if ( causes.count() ) {
1860 doc += QLatin1String(
"<h3>" );
1861 doc +=
i18n(
"Possible Causes:" );
1862 doc += QLatin1String(
"</h3><ul><li>" );
1863 doc += causes.join(
"</li><li>" );
1864 doc += QLatin1String(
"</li></ul>" );
1866 if ( solutions.count() ) {
1867 doc += QLatin1String(
"<h3>" );
1868 doc +=
i18n(
"Possible Solutions:" );
1869 doc += QLatin1String(
"</h3><ul><li>" );
1870 doc += solutions.join(
"</li><li>" );
1871 doc += QLatin1String(
"</li></ul>" );
1874 html.replace( QLatin1String(
"TEXT"), doc );
1922 HTMLPartContainerElementImpl *elt = d->
m_frame ?
1923 d->
m_frame->m_partContainerElement.data() : 0;
1928 elt->partLoadingErrorNotify();
1937 if ( d->
m_doc && d->
m_doc->docLoader()->expireDate() &&
url().
protocol().toLower().startsWith(
"http"))
1949 if (mimeStr ==
"application/xhtml+xml")
1951 if (mimeStr ==
"image/svg+xml")
1953 if (mimeStr ==
"text/html" || mimeStr.isEmpty())
1957 if ((mime && mime->is(
"text/xml")) || mimeStr.endsWith(
"+xml"))
1960 if (mime && mime->is(
"text/plain"))
1963 if (khtmlImLoad::ImageManager::loaderDatabase()->supportedMimeTypes().contains(mimeStr))
1979 if ( d->
m_view->underMouse() )
1980 QToolTip::hideText();
1984 removeJSErrorExtension();
1989 KJS::Window *w = KJS::Window::retrieveWindow( part );
1991 w->forgetSuppressedWindows();
2007 if ( urlString != urlString2 ) {
2033 d->
m_doc = DOMImplementationImpl::createSVGDocument( d->
m_view );
2037 d->
m_doc = DOMImplementationImpl::createXMLDocument( d->
m_view );
2045 d->
m_doc = DOMImplementationImpl::createHTMLDocument( d->
m_view );
2047 static_cast<HTMLDocumentImpl *
>(d->
m_doc)->setHTMLRequested( type !=
MimeXHTML );
2053 if (!d->
m_doc->attached())
2054 d->
m_doc->attach( );
2064 if ( !userStyleSheet.isEmpty() )
2068 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2072 d->
m_doc->setParsing(
true);
2081 len = strlen( data );
2088 if(decoded.isEmpty())
2094 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2096 t->write( decoded,
true );
2113 d->
m_doc->setParseMode( DocumentImpl::Strict );
2119 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2121 t->write( str,
true );
2132 if (!decoded.isEmpty())
2135 d->
m_doc->finishParsing();
2139 void KHTMLPart::onFirstData()
2144 d->
m_doc->determineParseMode();
2150 d->
m_doc->setVisuallyOrdered();
2153 d->
m_doc->recalcStyle( NodeImpl::Force );
2159 if ( mime && ( mime->is(
"text/html" ) || mime->is(
"text/xml" ) ) )
2169 write( data.data(), data.size() );
2183 d->
m_view->paint(p, rc, yOff, more);
2193 for (; it !=
end; ++it ) {
2194 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
2199 void KHTMLPart::resetFromScript()
2204 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2205 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2206 d->
m_doc->setParsing(
true);
2211 void KHTMLPart::slotFinishedParsing()
2213 d->
m_doc->setParsing(
false);
2214 d->
m_doc->dispatchHTMLEvent(EventImpl::KHTML_CONTENTLOADED_EVENT,
true,
false);
2215 checkEmitLoadEvent();
2216 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2224 void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
2226 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2251 void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
2253 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2273 void KHTMLPart::slotProgressUpdate()
2294 void KHTMLPart::slotJobSpeed(
KJob* ,
unsigned long speed )
2301 void KHTMLPart::slotJobPercent(
KJob* ,
unsigned long percent )
2311 void KHTMLPart::slotJobDone(
KJob* )
2321 void KHTMLPart::slotUserSheetStatDone(
KJob *_job )
2323 using namespace KIO;
2325 if ( _job->
error() ) {
2347 *pendingRedirections =
false;
2352 for (; it !=
end; ++it ) {
2353 if ( !(*it)->m_bCompleted || (*it)->m_run )
2359 if ( (*it)->m_bPendingRedirection )
2360 *pendingRedirections =
true;
2368 for (; oi != oiEnd; ++oi )
2369 if ( !(*oi)->m_bCompleted )
2374 if ( m_doc && m_doc->parsing() )
2379 if ( m_doc && m_doc->docLoader() )
2380 requests = khtml::Cache::loader()->numRequests( m_doc->docLoader() );
2391 void KHTMLPart::checkCompleted()
2406 bool fullyLoaded, pendingChildRedirections;
2430 checkEmitLoadEvent();
2432 bool pendingAction =
false;
2446 pendingAction =
true;
2448 else if ( pendingChildRedirections )
2450 pendingAction =
true;
2457 d->
m_view->complete( pendingAction );
2462 sheets = d->
m_doc->availableStyleSheets();
2463 sheets.prepend(
i18n(
"Automatic Detection" ) );
2467 if (sheets.count() > 2)
2470 slotUseStylesheet();
2481 void KHTMLPart::checkEmitLoadEvent()
2483 bool fullyLoaded, pendingChildRedirections;
2499 #ifndef KDE_NO_COMPAT // KDE5: remove this ifndef, keep the method (renamed to baseUrl)
2504 return d->
m_doc->baseURL();
2517 return KUrl( d->
m_doc->completeURL( url ) );
2522 return KUrl::fromPercentEncoding( u.right( u.length() - 11 ).toUtf8() );
2527 QString script = codeForJavaScriptURL(u);
2528 kDebug( 6050 ) <<
"script=" << script;
2531 q->begin( q->url() );
2532 q->setAlwaysHonourDoctype();
2533 q->write( res.toString() );
2536 emit q->completed();
2541 return url.indexOf( QLatin1String(
"javascript:" ), 0, Qt::CaseInsensitive ) == 0;
2548 kDebug(6050) <<
"delay=" << delay <<
" url=" << url <<
" from=" << this->
url() <<
"parent=" <<
parentPart();
2559 if( delay < 24*60*60 &&
2576 m_delayRedirect = 0;
2577 m_redirectURL.clear();
2578 m_redirectionTimer.stop();
2581 void KHTMLPart::slotRedirect()
2603 kWarning(6050) <<
"KHTMLPart::scheduleRedirection: Redirection from " << cUrl <<
" to " << url <<
" REJECTED!";
2608 if ( url.
equals(this->url(),
2626 if ( !
urlSelected( u, 0, 0,
"_self", args, browserArgs ) ) {
2632 void KHTMLPart::slotRedirection(
KIO::Job*,
const KUrl& url)
2645 if( !
url().isEmpty() ) {
2666 return defaultEncoding();
2669 QString KHTMLPart::defaultEncoding()
const
2672 if ( !encoding.isEmpty() )
2677 return "iso-8859-1";
2685 (
void)
new khtml::PartStyleSheetLoader(
this, url.
url(), d->
m_doc->docLoader());
2691 d->
m_doc->setUserStyleSheet( styleSheet );
2699 HTMLCollectionImpl *anchors =
2700 new HTMLCollectionImpl( d->
m_doc, HTMLCollectionImpl::DOC_ANCHORS);
2702 NodeImpl *n = anchors->namedItem(name);
2706 n = d->
m_doc->getElementById( name );
2709 d->
m_doc->setCSSTarget(n);
2712 bool quirkyName = !n && !d->
m_doc->inStrictMode() && (name.isEmpty() || name.toLower() ==
"top");
2718 kDebug(6050) << name <<
"not found";
2724 HTMLElementImpl *a =
static_cast<HTMLElementImpl *
>(n);
2726 a->getUpperLeftCorner(x, y);
2727 if (x <= d->m_view->contentsX())
2730 gox = d->
m_view->contentsX();
2731 if ( x + 10 > d->
m_view->contentsX()+d->
m_view->visibleWidth()) {
2732 a->getLowerRightCorner(x, dummy);
2733 gox = x - d->
m_view->visibleWidth() + 10;
2737 d->
m_view->setContentsPos(gox, y);
2746 d->
m_view->focusNextPrevNode (
true );
2755 d->
m_view->focusNextPrevNode (
false );
2804 this->*flag = value;
2810 for (; it != itEnd; ++it) {
2820 for (; it != itEnd; ++it) {
2828 void KHTMLPart::initCaret()
2834 if (d->
m_doc->isHTMLDocument()) {
2835 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
2836 node = htmlDoc->body();
2850 if (!khtml::KHTMLPartAccessor::caret(part).caretPos().node()->isContentEditable())
2904 Q_UNUSED(extendSelection);
2905 #ifndef KHTML_NO_CARET
2907 kDebug(6200) <<
"node: " << node.
handle() <<
" nodeName: "
2909 <<
" extendSelection " << extendSelection;
2910 if (
view()->moveCaretTo(node.
handle(), offset, !extendSelection))
2911 emitSelectionChanged();
2912 view()->ensureCaretVisible();
2914 #endif // KHTML_NO_CARET
2920 #ifndef KHTML_NO_CARET
2922 #else // KHTML_NO_CARET
2924 #endif // KHTML_NO_CARET
2933 #ifndef KHTML_NO_CARET
2934 view()->setCaretDisplayPolicyNonFocused(policy);
2935 #endif // KHTML_NO_CARET
2943 if (
isCaretMode() || (caretNode && caretNode->isContentEditable())) {
2944 invalidateSelection();
2945 enableFindAheadActions(
false);
2951 clearCaretRectIfNeeded();
2961 bool KHTMLPart::initFindNode(
bool selection,
bool reverse,
bool fromCursor )
2966 void KHTMLPart::slotFind()
2971 if (!part->inherits(
"KHTMLPart") )
2973 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
2979 void KHTMLPart::slotFindNext()
2984 if (!part->inherits(
"KHTMLPart") )
2986 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
2992 void KHTMLPart::slotFindPrev()
2997 if (!part->inherits(
"KHTMLPart") )
2999 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
3005 void KHTMLPart::slotFindDone()
3010 void KHTMLPart::slotFindAheadText()
3020 void KHTMLPart::slotFindAheadLink()
3030 void KHTMLPart::enableFindAheadActions(
bool )
3035 void KHTMLPart::slotFindDialogDestroyed()
3062 bool KHTMLPart::pFindTextNextInThisFrame(
bool reverse )
3071 kDebug() <<
"Selection is not valid. Returning empty selection";
3074 if(sel.start().offset() < 0 || sel.end().offset() < 0) {
3075 kDebug() <<
"invalid values for end/startOffset " << sel.start().offset() <<
" " << sel.end().offset();
3081 int exceptioncode = 0;
3082 return r.
handle()->toHTML(exceptioncode).string();
3087 bool hasNewLine =
true;
3088 bool seenTDTag =
false;
3094 DOM::DOMStringImpl *dstr =
static_cast<DOM::TextImpl*
>(n.
handle())->renderString();
3095 QString str(dstr->s, dstr->l);
3096 if(!str.isEmpty()) {
3102 if(n == sel.start().node() && n == sel.end().node()) {
3103 int s = khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset();
3104 int e = khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset();
3105 text = str.mid(s, e-s);
3106 }
else if(n == sel.start().node()) {
3107 text = str.mid(khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset());
3108 }
else if(n == sel.end().node()) {
3109 text += str.left(khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset());
3119 text +=
static_cast<HTMLTextAreaElementImpl*
>(n.
handle())->value().string();
3122 if (static_cast<HTMLInputElementImpl*>(n.
handle())->inputType() != HTMLInputElementImpl::PASSWORD)
3123 text += static_cast<HTMLInputElementImpl*>(n.
handle())->value().string();
3126 text +=
static_cast<HTMLSelectElementImpl*
>(n.
handle())->value().string();
3133 text +=
static_cast<HTMLImageElementImpl*
>(n.
handle())->altText().string();
3167 if(n == sel.end().node())
break;
3218 int end = text.length();
3221 while ((start < end) && (text[start] ==
'\n'))
3225 while ((start < (end-1)) && (text[end-1] ==
'\n') && (text[end-2] ==
'\n'))
3228 return text.mid(start, end-start);
3231 QString KHTMLPart::simplifiedSelectedText()
const
3234 text.replace(QChar(0xa0),
' ');
3236 while (!text.isEmpty() && text[0].isSpace())
3238 while (!text.isEmpty() && text[text.length()-1].isSpace())
3239 text.truncate(text.length()-1);
3267 const Selection &KHTMLPart::caret()
const
3272 const Selection &KHTMLPart::dragCaret()
const
3277 void KHTMLPart::setCaret(
const Selection &s,
bool closeTyping)
3280 clearCaretRectIfNeeded();
3281 setFocusNodeIfNeeded(s);
3283 notifySelectionChanged(closeTyping);
3287 void KHTMLPart::setDragCaret(
const DOM::Selection &dragCaret)
3296 void KHTMLPart::clearSelection()
3298 clearCaretRectIfNeeded();
3300 #ifdef APPLE_CHANGES
3305 notifySelectionChanged();
3308 void KHTMLPart::invalidateSelection()
3310 clearCaretRectIfNeeded();
3312 selectionLayoutChanged();
3315 void KHTMLPart::setSelectionVisible(
bool flag)
3320 clearCaretRectIfNeeded();
3327 void KHTMLPart::slotClearSelection()
3332 clearCaretRectIfNeeded();
3334 #ifdef APPLE_CHANGES
3340 notifySelectionChanged();
3344 void KHTMLPart::clearCaretRectIfNeeded()
3352 void KHTMLPart::setFocusNodeIfNeeded(
const Selection &s)
3354 if (!xmlDocImpl() || s.state() == Selection::NONE)
3357 NodeImpl *n = s.start().node();
3358 NodeImpl *target = (n && n->isContentEditable()) ? n : 0;
3360 while (n && n != s.end().node()) {
3361 if (n->isContentEditable()) {
3365 n = n->traverseNextNode();
3368 assert(target == 0 || target->isContentEditable());
3371 for ( ; target && !target->isFocusable(); target = target->parentNode())
3373 if (target && target->isMouseFocusable())
3374 xmlDocImpl()->setFocusNode(target);
3375 else if (!target || !target->focused())
3376 xmlDocImpl()->setFocusNode(0);
3380 void KHTMLPart::selectionLayoutChanged()
3399 d->
m_view->ensureVisible(r.x(), r.y());
3403 d->
m_doc->updateSelection();
3410 void KHTMLPart::notifySelectionChanged(
bool closeTyping)
3413 selectionLayoutChanged();
3421 emitSelectionChanged();
3456 int dots = name.count(
'.');
3457 if (dots > 2 || (dots == 2 && !name.startsWith(
"www.")))
3476 void KHTMLPart::paintCaret(QPainter *p,
const QRect &rect)
const
3482 void KHTMLPart::paintDragCaret(QPainter *p,
const QRect &rect)
const
3493 void KHTMLPart::resetHoverText()
3501 setStatusBarText(
QString(), BarHoverText);
3506 void KHTMLPart::overURL(
const QString &url,
const QString &target,
bool )
3511 if ( url.isEmpty() )
3516 if ( url.isEmpty() ) {
3517 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3524 if (url.startsWith(
"javascript:window.open"))
3525 jscode +=
i18n(
" (In new window)");
3526 setStatusBarText( Qt::escape( jscode ), BarHoverText );
3538 com = typ->comment( u );
3540 if ( !u.isValid() ) {
3541 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3551 KDE_struct_stat buff;
3554 KDE_struct_stat lbuff;
3560 if (ok && S_ISLNK( lbuff.st_mode ) )
3564 tmp =
i18n(
"Symbolic Link");
3566 tmp =
i18n(
"%1 (Link)", com);
3567 char buff_two[1024];
3569 int n = readlink ( path.toLocal8Bit().data(), buff_two, 1022);
3574 setStatusBarText(text2, BarHoverText);
3583 else if ( ok && S_ISREG( buff.st_mode ) )
3585 if (buff.st_size < 1024)
3586 text =
i18np(
"%2 (%1 byte)",
"%2 (%1 bytes)", (
long) buff.st_size, text2);
3589 float d = (float) buff.st_size/1024.0;
3595 else if ( ok && S_ISDIR( buff.st_mode ) )
3605 setStatusBarText(text, BarHoverText);
3610 if (target.toLower() ==
"_blank")
3612 extra =
i18n(
" (In new window)");
3614 else if (!target.isEmpty() &&
3615 (target.toLower() !=
"_top") &&
3616 (target.toLower() !=
"_self") &&
3617 (target.toLower() !=
"_parent"))
3623 extra =
i18n(
" (In new window)");
3625 extra =
i18n(
" (In other frame)");
3628 if (u.
protocol() == QLatin1String(
"mailto")) {
3630 mailtoMsg +=
i18n(
"Email to: ") + KUrl::fromPercentEncoding(u.
path().toLatin1());
3632 QStringList::ConstIterator it = queries.begin();
3633 const QStringList::ConstIterator itEnd = queries.end();
3634 for (; it != itEnd; ++it)
3635 if ((*it).startsWith(QLatin1String(
"subject=")))
3636 mailtoMsg +=
i18n(
" - Subject: ") + KUrl::fromPercentEncoding((*it).mid(8).toLatin1());
3637 else if ((*it).startsWith(QLatin1String(
"cc=")))
3638 mailtoMsg +=
i18n(
" - CC: ") + KUrl::fromPercentEncoding((*it).mid(3).toLatin1());
3639 else if ((*it).startsWith(QLatin1String(
"bcc=")))
3640 mailtoMsg +=
i18n(
" - BCC: ") + KUrl::fromPercentEncoding((*it).mid(4).toLatin1());
3641 mailtoMsg = Qt::escape(mailtoMsg);
3642 mailtoMsg.replace(QRegExp(
"([\n\r\t]|[ ]{10})"),
QString());
3643 setStatusBarText(
"<qt>"+mailtoMsg, BarHoverText);
3648 else if (u.
protocol() == QLatin1String(
"http")) {
3653 if (!hrefNode.
isNull()) {
3655 if (!hreflangNode.
isNull()) {
3658 if (countryCode == QLatin1String(
"en"))
3659 countryCode = QLatin1String(
"gb");
3660 QString flagImg = QLatin1String(
"<img src=%1>").arg(
3661 locate(
"locale", QLatin1String(
"l10n/")
3663 + QLatin1String(
"/flag.png")));
3664 emit setStatusBarText(flagImg + u.
prettyUrl() + extra);
3669 setStatusBarText(Qt::escape(u.
prettyUrl()) + extra, BarHoverText);
3681 bool hasTarget =
false;
3684 if ( target.isEmpty() && d->m_doc )
3685 target = d->m_doc->baseTarget();
3686 if ( !target.isEmpty() )
3689 if ( d->isJavaScriptURL(url) )
3691 crossFrameExecuteScript( target, d->codeForJavaScriptURL(url) );
3697 if ( url.isEmpty() )
3700 if ( !cURL.isValid() )
3704 kDebug(6050) <<
this <<
"complete URL:" << cURL.
url() <<
"target=" << target;
3706 if ( state & Qt::ControlModifier )
3708 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3712 if ( button == Qt::LeftButton && ( state & Qt::ShiftModifier ) )
3715 metaData.insert(
"referrer", d->m_referrer );
3720 if (!checkLinkSecurity(cURL,
3721 ki18n(
"<qt>This untrusted page links to<br /><b>%1</b>.<br />Do you want to follow the link?</qt>" ),
3727 args.
metaData().insert(
"main_frame_request",
3729 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
3730 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
3731 args.
metaData().insert(
"PropagateHttpHeader",
"true");
3732 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
3733 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
3735 if ( hasTarget && target !=
"_self" && target !=
"_top" && target !=
"_blank" && target !=
"_parent" )
3738 khtml::ChildFrame *frame = recursiveFrameRequest(
this, cURL, args, browserArgs,
false );
3741 args.
metaData()[
"referrer"] = d->m_referrer;
3742 requestObject( frame, cURL, args, browserArgs );
3747 if (!d->m_referrer.isEmpty() && !args.
metaData().contains(
"referrer"))
3748 args.
metaData()[
"referrer"] = d->m_referrer;
3750 if ( button == Qt::NoButton && (state & Qt::ShiftModifier) && (state & Qt::ControlModifier) )
3752 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3756 if ( state & Qt::ShiftModifier)
3760 emit d->m_extension->createNewWindow( cURL, args, browserArgs, winArgs );
3767 if (cURL.
hasRef() && (!hasTarget || target ==
"_self"))
3769 if (d->isLocalAnchorJump(cURL))
3771 d->executeAnchorJump(cURL, browserArgs.
lockHistory() );
3776 if ( !d->m_bComplete && !hasTarget )
3779 view()->viewport()->unsetCursor();
3780 emit d->m_extension->openUrlRequest( cURL, args, browserArgs );
3784 void KHTMLPart::slotViewDocumentSource()
3787 bool isTempFile =
false;
3791 sourceFile.
setSuffix(defaultExtension());
3792 sourceFile.setAutoRemove(
false);
3793 if (sourceFile.open())
3795 QDataStream stream ( &sourceFile );
3797 currentUrl =
KUrl();
3798 currentUrl.setPath(sourceFile.fileName());
3803 (void)
KRun::runUrl( currentUrl, QLatin1String(
"text/plain"),
view(), isTempFile );
3806 void KHTMLPart::slotViewPageInfo()
3811 dlg->setAttribute(Qt::WA_DeleteOnClose);
3812 dlg->setObjectName(
"KHTML Page Info Dialog");
3817 connect(ui._close, SIGNAL(clicked()), dlg, SLOT(accept()));
3819 ui._title->setText(d->m_doc->title().string());
3822 if (
parentPart() && d->m_doc && d->m_doc->isHTMLDocument() ) {
3823 dlg->setWindowTitle(
i18n(
"Frame Information"));
3828 if (!d->m_pageServices.isEmpty())
3829 editStr =
i18n(
" <a href=\"%1\">[Properties]</a>", d->m_pageServices);
3832 ui._url->setText(
"<a href=\"" +
url().
url() +
"\">" + squeezedURL +
"</a>" + editStr);
3835 ui._lastModified->hide();
3836 ui._lmLabel->hide();
3842 if (enc.isEmpty()) {
3844 ui._encoding->hide();
3846 ui._encoding->setText(enc);
3849 if (!xmlDocImpl() || xmlDocImpl()->parseMode() == DOM::DocumentImpl::Unknown) {
3851 ui._modeLabel->hide();
3853 switch (xmlDocImpl()->parseMode()) {
3854 case DOM::DocumentImpl::Compat:
3855 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Quirks"));
3857 case DOM::DocumentImpl::Transitional:
3858 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Almost standards"));
3860 case DOM::DocumentImpl::Strict:
3862 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Strict"));
3868 const QStringList headers = d->m_httpHeaders.split(
"\n");
3870 QStringList::ConstIterator it = headers.begin();
3871 const QStringList::ConstIterator itEnd = headers.end();
3873 for (; it != itEnd; ++it) {
3875 if (header.count() != 2)
3877 QTreeWidgetItem *item =
new QTreeWidgetItem(ui._headers);
3878 item->setText(0, header[0]);
3879 item->setText(1, header[1]);
3887 void KHTMLPart::slotViewFrameSource()
3894 bool isTempFile =
false;
3895 if (!(url.
isLocalFile()) && frame->inherits(
"KHTMLPart"))
3897 long cacheId =
static_cast<KHTMLPart *
>(frame)->d->m_cacheId;
3902 sourceFile.
setSuffix(defaultExtension());
3903 sourceFile.setAutoRemove(
false);
3904 if (sourceFile.open())
3906 QDataStream stream ( &sourceFile );
3909 url.
setPath(sourceFile.fileName());
3915 (void)
KRun::runUrl( url, QLatin1String(
"text/plain"),
view(), isTempFile );
3921 if (!d->m_doc || !d->m_doc->isHTMLDocument())
3924 QString relURL =
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
3929 void KHTMLPart::slotSaveBackground()
3932 metaData[
"referrer"] = d->m_referrer;
3936 void KHTMLPart::slotSaveDocument()
3941 srcURL.setFileName(
"index" + defaultExtension() );
3948 void KHTMLPart::slotSecurity()
3972 const QStringList sl = d->m_ssl_peer_chain.split(
'\n', QString::SkipEmptyParts);
3974 bool certChainOk = d->m_ssl_in_use;
3976 foreach (
const QString &s, sl) {
3977 certChain.append(QSslCertificate(s.toAscii()));
3978 if (certChain.last().isNull()) {
3979 certChainOk =
false;
3985 kid->setup(certChain,
3989 d->m_ssl_cipher_desc,
3990 d->m_ssl_cipher_version,
3991 d->m_ssl_cipher_used_bits.toInt(),
3992 d->m_ssl_cipher_bits.toInt(),
4001 QStringList sl = d->m_ssl_peer_chain.split(
'\x01', QString::SkipEmptyParts);
4003 bool decodedOk =
true;
4004 foreach (
const QString &s, sl) {
4005 certChain.append(QSslCertificate(s.toAscii()));
4006 if (certChain.last().isNull()) {
4012 if (decodedOk ||
true ) {
4016 d->m_ssl_protocol_version,
4018 d->m_ssl_cipher_used_bits.toInt(),
4019 d->m_ssl_cipher_bits.toInt(),
4021 kDebug(7024) <<
"Showing SSL Info dialog";
4023 kDebug(7024) <<
"SSL Info dialog closed";
4026 "appears to be corrupt."),
4031 void KHTMLPart::slotSaveFrame()
4040 srcURL.
setFileName(
"index" + defaultExtension() );
4047 void KHTMLPart::slotSetEncoding(
const QString &enc)
4055 d->m_autoDetectLanguage=scri;
4059 void KHTMLPart::slotUseStylesheet()
4063 bool autoselect = (d->m_paUseStylesheet->currentItem() == 0);
4064 d->m_sheetUsed = autoselect ?
QString() : d->m_paUseStylesheet->currentText();
4065 d->m_doc->updateStyleSelector();
4069 void KHTMLPart::updateActions()
4071 bool frames =
false;
4075 for (; it !=
end; ++it )
4082 if (d->m_paViewFrame)
4083 d->m_paViewFrame->setEnabled( frames );
4084 if (d->m_paSaveFrame)
4085 d->m_paSaveFrame->setEnabled( frames );
4088 d->m_paFind->setText(
i18n(
"&Find in Frame..." ) );
4090 d->m_paFind->setText(
i18n(
"&Find..." ) );
4097 bool enableFindAndSelectAll =
true;
4100 enableFindAndSelectAll = frame->inherits(
"KHTMLPart" );
4102 d->m_paFind->setEnabled( enableFindAndSelectAll );
4103 d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
4105 bool enablePrintFrame =
false;
4111 enablePrintFrame = ext->metaObject()->indexOfSlot(
"print()" ) != -1;
4114 d->m_paPrintFrame->setEnabled( enablePrintFrame );
4119 if ( d->m_doc && d->m_doc->isHTMLDocument() &&
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body() && !d->m_bClearing )
4120 bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4122 if (d->m_paSaveBackground)
4123 d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
4125 if ( d->m_paDebugScript )
4126 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
4132 if ((*it)->m_partContainerElement.data() == frame)
4133 return (*it)->m_scriptable.data();
4137 void KHTMLPart::loadFrameElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4143 FrameIt it = d->m_frames.find( frameName );
4144 if ( it == d->m_frames.end() ) {
4147 child->
m_name = frameName;
4148 d->m_frames.insert( d->m_frames.end(), child );
4160 QString khtml = QString::fromLatin1(
"khtml");
4162 QString::fromLatin1(
"text/html"),
4169 navigateLocalProtocol(child, part,
KUrl(
"about:blank"));
4170 connectToChildPart(child, part,
"text/html" );
4180 if (!requestObject( child, u ) && !child->
m_run) {
4185 QString KHTMLPart::requestFrameName()
4187 return QString::fromLatin1(
"<!--frame %1-->").arg(d->m_frameNameId++);
4190 bool KHTMLPart::loadObjectElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4195 FrameIt it = d->m_objects.insert( d->m_objects.end(), child );
4198 (*it)->m_params = params;
4202 if (!requestObject( *it,
completeURL( url ), args ) && !(*it)->m_run) {
4203 (*it)->m_bCompleted =
true;
4214 if (!d->isJavaScriptURL(url.
url()) && !checkLinkSecurity(url))
4216 kDebug(6031) <<
this <<
"checkLinkSecurity refused";
4238 if ( child->
m_run ) {
4239 kDebug(6031) <<
"navigating ChildFrame while mimetype resolution was in progress...";
4240 child->
m_run.data()->abort();
4256 if (!d->m_referrer.isEmpty() && !child->
m_args.
metaData().contains(
"referrer" ))
4260 child->
m_args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4261 child->
m_args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4265 d->m_ssl_in_use ?
"TRUE":
"FALSE");
4266 child->
m_args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4272 if ((url.isEmpty() || url.
url() ==
"about:blank" || url.
protocol() ==
"javascript") && args.
mimeType().isEmpty())
4276 kDebug(6031) <<
"Running new KHTMLRun for" <<
this <<
"and child=" << child;
4278 d->m_bComplete =
false;
4281 return processObjectRequest( child, url, args.
mimeType() );
4296 kDebug( 6031 ) <<
"trying to create part for" << mimetype << _url;
4306 if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) ) {
4307 childLoadFailure(child);
4319 emit d->m_extension->openUrlNotify();
4333 (child->
m_run && child->
m_run.data()->serverSuggestsSave())) {
4352 int disposition = 0;
4354 suggestedFileName =
run->suggestedFileName();
4355 disposition =
run->serverSuggestsSave() ?
4361 dlg.setSuggestedFileName( suggestedFileName );
4386 if (mime->is(
"text/html")
4387 || mime->is(
"application/xml")) {
4396 childLoadFailure(child);
4400 connectToChildPart( child, part, mimetype );
4404 checkEmitLoadEvent();
4437 return navigateChild( child, url );
4443 if (!qobject_cast<KHTMLPart*>(inPart))
4451 d->propagateInitialDomainAndBaseTo(p);
4454 if (d->isJavaScriptURL(url.
url())) {
4457 d->codeForJavaScriptURL(url.
url()));
4462 d->propagateInitialDomainAndBaseTo(p);
4463 p->
write( res.toString() );
4469 p->
write(
"<HTML><TITLE></TITLE><BODY></BODY></HTML>");
4479 if (url.
protocol() ==
"javascript" || url.
url() ==
"about:blank") {
4480 return navigateLocalProtocol(child, child->
m_part.data(),
url);
4481 }
else if ( !url.isEmpty() ) {
4482 kDebug( 6031 ) <<
"opening" << url <<
"in frame" << child->
m_part;
4483 bool b = child->
m_part.data()->openUrl( url );
4498 kDebug(6031) <<
"we:" <<
this <<
"kid:" << child << part << mimetype;
4500 part->setObjectName( child->
m_name );
4504 if (!qobject_cast<KHTMLPart*>(p) && child->
m_jscript)
4522 if (qobject_cast<KHTMLPart*>(part)) {
4523 static_cast<KHTMLPart*
>(part)->d->m_frame = child;
4535 scriptExt->
setHost(d->m_scriptableExtension);
4540 sb->
setStatusBar( d->m_statusBarExtension->statusBar() );
4543 this, SLOT(slotChildStarted(
KIO::Job*)) );
4545 this, SLOT(slotChildCompleted()) );
4547 this, SLOT(slotChildCompleted(
bool)) );
4548 connect( part, SIGNAL(setStatusBarText(
QString)),
4549 this, SIGNAL(setStatusBarText(
QString)) );
4550 if ( part->inherits(
"KHTMLPart" ) )
4553 part, SLOT(slotParentCompleted()) );
4555 part, SLOT(slotParentCompleted()) );
4559 this, SLOT(slotChildDocCreated()) );
4566 connect( kidBrowserExt, SIGNAL(openUrlNotify()),
4567 d->m_extension, SIGNAL(openUrlNotify()) );
4580 connect( kidBrowserExt, SIGNAL(infoMessage(
QString)),
4581 d->m_extension, SIGNAL(infoMessage(
QString)) );
4586 kidBrowserExt->setBrowserInterface( d->m_extension->browserInterface() );
4596 if ( !serviceName.isEmpty() )
4597 constr.append( QString::fromLatin1(
"DesktopEntryName == '%1'" ).arg( serviceName ) );
4601 if ( offers.isEmpty() ) {
4602 int pos = mimetype.indexOf(
"-plugin" );
4605 QString stripped_mime = mimetype.left( pos );
4607 if ( offers.isEmpty() )
4611 KService::List::ConstIterator it = offers.constBegin();
4612 const KService::List::ConstIterator itEnd = offers.constEnd();
4613 for ( ; it != itEnd; ++it )
4621 QVariantList variantlist;
4622 Q_FOREACH(
const QString& str, params)
4625 if ( service->
serviceTypes().contains(
"Browser/View" ) )
4626 variantlist <<
QString(
"Browser/View");
4631 serviceName = service->
name();
4636 kWarning() <<
QString(
"There was an error loading the module %1.\nThe diagnostics is:\n%2")
4645 if ( !d->m_manager && d->m_view )
4648 d->m_manager->setObjectName(
"khtml part manager" );
4650 connect( d->m_manager, SIGNAL(activePartChanged(
KParts::Part*)),
4652 connect( d->m_manager, SIGNAL(partRemoved(
KParts::Part*)),
4656 return d->m_manager;
4659 void KHTMLPart::submitFormAgain()
4661 disconnect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4662 if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
4663 KHTMLPart::submitForm( d->m_submitForm->submitAction, d->m_submitForm->submitUrl, d->m_submitForm->submitFormData, d->m_submitForm->target, d->m_submitForm->submitContentType, d->m_submitForm->submitBoundary );
4665 delete d->m_submitForm;
4666 d->m_submitForm = 0;
4671 submitForm(action, url, formData, _target, contentType, boundary);
4674 void KHTMLPart::submitForm(
const char *action,
const QString &url,
const QByteArray &formData,
const QString &_target,
const QString& contentType,
const QString& boundary )
4676 kDebug(6000) <<
this <<
"target=" << _target <<
"url=" <<
url;
4704 if (!d->m_submitForm) {
4706 if (d->m_ssl_in_use) {
4708 "\nA third party may be able to intercept and view this information."
4709 "\nAre you sure you wish to continue?"),
4715 if (kss.warnOnUnencrypted()) {
4717 i18n(
"Warning: Your data is about to be transmitted across the network unencrypted."
4718 "\nAre you sure you wish to continue?"),
4719 i18n(
"Network Transmission"),
4722 "WarnOnUnencryptedForm");
4724 QString grpNotifMsgs = QLatin1String(
"Notification Messages");
4727 if (!cg.readEntry(
"WarnOnUnencryptedForm",
true)) {
4728 cg.deleteEntry(
"WarnOnUnencryptedForm");
4730 kss.setWarnOnUnencrypted(
false);
4741 i18n(
"This site is attempting to submit form data via email.\n"
4742 "Do you want to continue?"),
4743 i18n(
"Network Transmission"),
4746 "WarnTriedEmailSubmit");
4759 if ( d->isJavaScriptURL(urlstring) ) {
4760 crossFrameExecuteScript( _target, d->codeForJavaScriptURL(urlstring) );
4764 if (!checkLinkSecurity(u,
4765 ki18n(
"<qt>The form will be submitted to <br /><b>%1</b><br />on your local filesystem.<br />Do you want to submit the form?</qt>" ),
4771 d->clearRedirection();
4775 if (!d->m_referrer.isEmpty())
4776 args.
metaData()[
"referrer"] = d->m_referrer;
4778 args.
metaData().insert(
"PropagateHttpHeader",
"true");
4779 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4780 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4781 args.
metaData().insert(
"main_frame_request",
4783 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
4784 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4789 browserArgs.
frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
4796 bool triedToAttach =
false;
4798 QStringList::Iterator nvp = nvps.begin();
4799 const QStringList::Iterator nvpEnd = nvps.end();
4804 while (nvp != nvpEnd) {
4806 if (pair.count() >= 2) {
4807 if (pair.first().toLower() ==
"attach") {
4808 nvp = nvps.erase(nvp);
4809 triedToAttach =
true;
4819 KMessageBox::information(NULL,
i18n(
"This site attempted to attach a file from your computer in the form submission. The attachment was removed for your protection."),
i18n(
"KDE"),
"WarnTriedAttach");
4823 if (contentType.toLower() ==
"multipart/form-data") {
4825 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4827 }
else if (contentType.toLower() ==
"text/plain") {
4829 QString tmpbody = QString::fromLatin1(formData.data(),
4831 tmpbody.replace(QRegExp(
"[&]"),
"\n");
4832 tmpbody.replace(QRegExp(
"[+]"),
" ");
4833 tmpbody = KUrl::fromPercentEncoding(tmpbody.toLatin1());
4834 bodyEnc = QLatin1String( KUrl::toPercentEncoding(tmpbody) );
4836 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4837 formData.size())) );
4840 nvps.append(
QString(
"body=%1").arg(bodyEnc));
4845 if (
strcmp( action,
"get" ) == 0 ) {
4847 u.
setQuery( QString::fromLatin1( formData.data(), formData.size() ) );
4855 if (contentType.isNull() || contentType ==
"application/x-www-form-urlencoded")
4856 browserArgs.
setContentType(
"Content-Type: application/x-www-form-urlencoded" );
4858 browserArgs.
setContentType(
"Content-Type: " + contentType +
"; boundary=" + boundary );
4861 if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
4862 if( d->m_submitForm ) {
4863 kDebug(6000) <<
"ABORTING!";
4868 d->m_submitForm->submitUrl =
url;
4869 d->m_submitForm->submitFormData = formData;
4870 d->m_submitForm->target = _target;
4871 d->m_submitForm->submitContentType = contentType;
4872 d->m_submitForm->submitBoundary = boundary;
4873 connect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4877 emit d->m_extension->openUrlRequest( u, args, browserArgs );
4890 if ( linkUrl.isEmpty() ) {
4896 popupURL = khtmlPart->
url();
4904 linkKUrl = popupURL;
4908 if (!(d->m_strSelectedURLTarget).isEmpty() &&
4909 (d->m_strSelectedURLTarget.toLower() !=
"_top") &&
4910 (d->m_strSelectedURLTarget.toLower() !=
"_self") &&
4911 (d->m_strSelectedURLTarget.toLower() !=
"_parent")) {
4912 if (d->m_strSelectedURLTarget.toLower() ==
"_blank")
4927 QPointer<QObject> guard( client );
4929 QString mimetype = QLatin1String(
"text/html" );
4932 if (!linkUrl.isEmpty())
4941 if (!fname.isEmpty() && !popupURL.
hasRef() && popupURL.
query().isEmpty())
4950 !pmt->is(
"application/x-perl") &&
4951 !pmt->is(
"application/x-perl-module") &&
4952 !pmt->is(
"application/x-php") &&
4953 !pmt->is(
"application/x-python-bytecode") &&
4954 !pmt->is(
"application/x-python") &&
4955 !pmt->is(
"application/x-shellscript"))
4956 mimetype = pmt->name();
4963 emit d->m_extension->popupMenu( QCursor::pos(), popupURL, S_IFREG ,
4964 args, browserArgs, itemflags,
4967 if ( !guard.isNull() ) {
4969 emit
popupMenu(linkUrl, QCursor::pos());
4970 d->m_strSelectedURL.clear();
4971 d->m_strSelectedURLTarget.clear();
4975 void KHTMLPart::slotParentCompleted()
4978 if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
4981 d->m_redirectionTimer.setSingleShot(
true );
4982 d->m_redirectionTimer.start( qMax(0, 1000 * d->m_delayRedirect) );
4986 void KHTMLPart::slotChildStarted(
KIO::Job *job )
4994 if ( d->m_bComplete )
5000 emit d->m_extension->openURLNotify();
5003 d->m_bComplete =
false;
5008 void KHTMLPart::slotChildCompleted()
5010 slotChildCompleted(
false );
5013 void KHTMLPart::slotChildCompleted(
bool pendingAction )
5025 if (!qobject_cast<KHTMLPart*>(child->
m_part))
5031 void KHTMLPart::slotChildDocCreated()
5036 if (
KHTMLPart* htmlFrame = qobject_cast<KHTMLPart*>(sender()))
5037 d->propagateInitialDomainAndBaseTo(htmlFrame);
5040 disconnect( sender(), SIGNAL(
docCreated()),
this, SLOT(slotChildDocCreated()) );
5047 if ( m_doc && kid->d->
m_doc ) {
5048 DocumentImpl* kidDoc = kid->d->
m_doc;
5049 if ( kidDoc->origin()->isEmpty() ) {
5050 kidDoc->setOrigin ( m_doc->origin() );
5051 kidDoc->setBaseURL( m_doc->baseURL() );
5063 if ( d->isJavaScriptURL(urlStr) ) {
5069 if ( !frameName.isEmpty() ) {
5070 if ( frameName == QLatin1String(
"_top" ) )
5072 emit d->m_extension->openUrlRequest( url, args, browserArgs );
5075 else if ( frameName == QLatin1String(
"_blank" ) )
5077 emit d->m_extension->createNewWindow( url, args, browserArgs );
5080 else if ( frameName == QLatin1String(
"_parent" ) )
5083 newBrowserArgs.frameName.clear();
5084 emit d->m_extension->openUrlRequest( url, args, newBrowserArgs );
5087 else if ( frameName != QLatin1String(
"_self" ) )
5089 khtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args, browserArgs );
5093 emit d->m_extension->openUrlRequest( url, args, browserArgs );
5104 requestObject( child, url, args, browserArgs );
5105 }
else if ( frameName==
"_self" )
5108 newBrowserArgs.frameName.clear();
5109 emit d->m_extension->openUrlRequest( url, args, newBrowserArgs );
5115 emit d->m_extension->requestFocus(
this);
5120 assert( obj->inherits(
"KParts::ReadOnlyPart" ) );
5123 FrameIt it = d->m_frames.begin();
5124 const FrameIt end = d->m_frames.end();
5125 for (; it !=
end; ++it ) {
5126 if ((*it)->m_part.data() == part )
5130 FrameIt oi = d->m_objects.begin();
5131 const FrameIt oiEnd = d->m_objects.end();
5132 for (; oi != oiEnd; ++oi ) {
5133 if ((*oi)->m_part.data() == part)
5142 bool KHTMLPart::checkFrameAccess(
KHTMLPart *callingHtmlPart)
5144 if (callingHtmlPart ==
this)
5147 if (!xmlDocImpl()) {
5148 #ifdef DEBUG_FINDFRAME
5149 kDebug(6050) <<
"Empty part" <<
this <<
"URL = " <<
url();
5155 if (callingHtmlPart && callingHtmlPart->xmlDocImpl() && xmlDocImpl()) {
5156 khtml::SecurityOrigin* actDomain = callingHtmlPart->xmlDocImpl()->origin();
5157 khtml::SecurityOrigin* destDomain = xmlDocImpl()->origin();
5159 if (actDomain->canAccess(destDomain))
5162 #ifdef DEBUG_FINDFRAME
5165 kDebug(6050) <<
"Unknown part/domain" << callingHtmlPart <<
"tries to access part" <<
this;
5180 #ifdef DEBUG_FINDFRAME
5181 kDebug(6050) << q <<
"URL =" << q->url() <<
"name =" << q->objectName() <<
"findFrameParent(" << f <<
")";
5186 if (!checkForNavigation && !q->checkFrameAccess(callingHtmlPart))
5189 if (!childFrame && !q->parentPart() && (q->objectName() == f)) {
5190 if (!checkForNavigation || callingHtmlPart->d->
canNavigate(q))
5194 FrameIt it = m_frames.find( f );
5195 const FrameIt end = m_frames.end();
5198 #ifdef DEBUG_FINDFRAME
5199 kDebug(6050) <<
"FOUND!";
5201 if (!checkForNavigation || callingHtmlPart->d->
canNavigate((*it)->m_part.data())) {
5208 it = m_frames.begin();
5209 for (; it !=
end; ++it )
5211 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5237 if (q->checkFrameAccess(b))
5241 if (q->parentPart() && top() == b)
5246 if (b->opener() && canNavigate(b->opener()))
5251 if (anc->checkFrameAccess(q))
5280 while ( part && part->inherits(
"KHTMLPart") &&
5281 static_cast<KHTMLPart *
>(part)->d->m_frames.count() > 0 ) {
5284 if ( !part )
return frameset;
5291 FrameIt it = d->m_frames.find( frameName );
5292 if ( it == d->m_frames.end() )
5298 return (!(*it)->m_partContainerElement.isNull());
5304 for (
int i = 0; i < m_frames.size(); ++i) {
5315 return kp->jScript();
5317 FrameIt it = d->m_frames.begin();
5318 const FrameIt itEnd = d->m_frames.end();
5320 for (; it != itEnd; ++it) {
5322 if (framePart == frame->
m_part.data()) {
5333 return qobject_cast<
KHTMLPart*>( parent() );
5340 #ifdef DEBUG_FINDFRAME
5341 kDebug( 6050 ) <<
this <<
"frame = " << args.frameName <<
"url = " <<
url;
5347 if (childPart ==
this)
5350 childPart->requestObject( childFrame, url, args, browserArgs );
5359 parentPart()->requestObject( res, url, args, browserArgs );
5365 #ifdef DEBUG_SAVESTATE
5366 static int s_saveStateIndentLevel = 0;
5371 #ifdef DEBUG_SAVESTATE
5373 const int indentLevel = s_saveStateIndentLevel++;
5374 kDebug( 6050 ) << indent <<
"saveState this=" <<
this <<
" '" << objectName() <<
"' saving URL " <<
url().
url();
5377 stream <<
url() << (
qint32)d->m_view->contentsX() << (
qint32)d->m_view->contentsY()
5378 << (
qint32) d->m_view->contentsWidth() << (
qint32) d->m_view->contentsHeight() << (
qint32) d->m_view->marginWidth() << (
qint32) d->m_view->marginHeight();
5381 int focusNodeNumber;
5382 if (!d->m_focusNodeRestored)
5383 focusNodeNumber = d->m_focusNodeNumber;
5384 else if (d->m_doc && d->m_doc->focusNode())
5385 focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
5387 focusNodeNumber = -1;
5388 stream << focusNodeNumber;
5391 stream << d->m_cacheId;
5397 docState = d->m_doc->docState();
5399 stream << d->m_encoding << d->m_sheetUsed << docState;
5401 stream << d->m_zoomFactor;
5402 stream << d->m_fontScaleFactor;
5404 stream << d->m_httpHeaders;
5405 stream << d->m_pageServices;
5406 stream << d->m_pageReferrer;
5409 stream << d->m_ssl_in_use
5410 << d->m_ssl_peer_chain
5413 << d->m_ssl_protocol_version
5414 << d->m_ssl_cipher_used_bits
5415 << d->m_ssl_cipher_bits
5416 << d->m_ssl_cert_errors
5417 << d->m_ssl_parent_ip
5418 << d->m_ssl_parent_cert;
5421 QStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
5428 for (; it !=
end; ++it )
5430 if ( !(*it)->m_part )
5433 frameNameLst << (*it)->m_name;
5434 frameServiceTypeLst << (*it)->m_serviceType;
5435 frameServiceNameLst << (*it)->m_serviceName;
5436 frameURLLst << (*it)->m_part.data()->url();
5439 QDataStream frameStream( &state, QIODevice::WriteOnly );
5441 if ( (*it)->m_extension )
5442 (*it)->m_extension.data()->saveState( frameStream );
5444 frameStateBufferLst << state;
5446 frameTypeLst << int( (*it)->m_type );
5450 stream << (
quint32) frameNameLst.count();
5451 stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst << frameTypeLst;
5452 #ifdef DEBUG_SAVESTATE
5453 s_saveStateIndentLevel = indentLevel;
5460 qint32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
5468 long old_cacheId = d->m_cacheId;
5470 stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
5472 d->m_view->setMarginWidth( mWidth );
5473 d->m_view->setMarginHeight( mHeight );
5477 stream >> d->m_focusNodeNumber;
5478 d->m_focusNodeRestored =
false;
5480 stream >> d->m_cacheId;
5482 stream >> encoding >> sheetUsed >> docState;
5485 d->m_sheetUsed = sheetUsed;
5495 stream >> d->m_httpHeaders;
5496 stream >> d->m_pageServices;
5497 stream >> d->m_pageReferrer;
5500 stream >> d->m_ssl_in_use
5501 >> d->m_ssl_peer_chain
5504 >> d->m_ssl_protocol_version
5505 >> d->m_ssl_cipher_used_bits
5506 >> d->m_ssl_cipher_bits
5507 >> d->m_ssl_cert_errors
5508 >> d->m_ssl_parent_ip
5509 >> d->m_ssl_parent_cert;
5513 stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
5514 >> frameURLs >> frameStateBuffers >> frameTypes;
5516 d->m_bComplete =
false;
5517 d->m_bLoadEventEmitted =
false;
5523 if (d->m_cacheId == old_cacheId &&
signed(frameCount) == d->m_frames.count())
5526 d->m_redirectionTimer.stop();
5528 FrameIt fIt = d->m_frames.begin();
5529 const FrameIt fEnd = d->m_frames.end();
5531 for (; fIt != fEnd; ++fIt )
5532 (*fIt)->m_bCompleted =
false;
5534 fIt = d->m_frames.begin();
5536 QStringList::ConstIterator fNameIt = frameNames.constBegin();
5537 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.constBegin();
5538 QStringList::ConstIterator fServiceNameIt = frameServiceNames.constBegin();
5539 KUrl::List::ConstIterator fURLIt = frameURLs.constBegin();
5543 for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt, ++fFrameTypeIt )
5552 child->
m_name = *fNameIt;
5555 processObjectRequest( child, *fURLIt, *fServiceTypeIt );
5560 if ( child->
m_extension && !(*fBufferIt).isEmpty() )
5562 QDataStream frameStream( *fBufferIt );
5563 child->
m_extension.data()->restoreState( frameStream );
5566 child->
m_part.data()->openUrl( *fURLIt );
5577 d->m_extension->setBrowserArguments(browserArgs);
5579 d->m_view->resizeContents( wContents, hContents );
5580 d->m_view->setContentsPos( xOffset, yOffset );
5590 d->m_bCleared =
false;
5593 d->m_sheetUsed = sheetUsed;
5595 QStringList::ConstIterator fNameIt = frameNames.constBegin();
5596 const QStringList::ConstIterator fNameEnd = frameNames.constEnd();
5598 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.constBegin();
5599 QStringList::ConstIterator fServiceNameIt = frameServiceNames.constBegin();
5600 KUrl::List::ConstIterator fURLIt = frameURLs.constBegin();
5604 for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt, ++fFrameTypeIt )
5608 newChild->
m_name = *fNameIt;
5614 const FrameIt childFrame = d->m_frames.insert( d->m_frames.end(), newChild );
5616 processObjectRequest( *childFrame, *fURLIt, *fServiceTypeIt );
5618 (*childFrame)->m_bPreloaded =
true;
5620 if ( (*childFrame)->m_part )
5622 if ( (*childFrame)->m_extension && !(*fBufferIt).isEmpty() )
5624 QDataStream frameStream( *fBufferIt );
5625 (*childFrame)->m_extension.data()->restoreState( frameStream );
5628 (*childFrame)->m_part.data()->openUrl( *fURLIt );
5639 d->m_extension->setBrowserArguments(browserArgs);
5643 d->m_restored =
true;
5645 d->m_restored =
false;
5669 return d->m_view->nodeUnderMouse();
5674 return d->m_view->nonSharedNodeUnderMouse();
5677 void KHTMLPart::emitSelectionChanged()
5681 if (!d->m_activeFrame)
5683 emit d->m_extension->enableAction(
"copy",
hasSelection() );
5691 return d->m_zoomFactor;
5695 static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
5704 void KHTMLPart::slotIncZoom()
5706 zoomIn(zoomSizes, zoomSizeCount);
5709 void KHTMLPart::slotDecZoom()
5711 zoomOut(zoomSizes, zoomSizeCount);
5714 void KHTMLPart::slotIncZoomFast()
5716 zoomIn(fastZoomSizes, fastZoomSizeCount);
5719 void KHTMLPart::slotDecZoomFast()
5721 zoomOut(fastZoomSizes, fastZoomSizeCount);
5724 void KHTMLPart::zoomIn(
const int stepping[],
int count)
5728 if (zoomFactor < maxZoom) {
5730 for (
int i = 0; i < count; ++i)
5731 if (stepping[i] > zoomFactor) {
5732 zoomFactor = stepping[i];
5739 void KHTMLPart::zoomOut(
const int stepping[],
int count)
5741 int zoomFactor = d->m_zoomFactor;
5742 if (zoomFactor > minZoom) {
5744 for (
int i = count-1; i >= 0; --i)
5745 if (stepping[i] < zoomFactor) {
5746 zoomFactor = stepping[i];
5757 if (percent < 100) percent = 100;
5760 if (percent > maxZoom) percent =
maxZoom;
5761 if (d->m_zoomFactor == percent)
return;
5762 d->m_zoomFactor = percent;
5771 QApplication::setOverrideCursor( Qt::WaitCursor );
5772 d->m_view->setZoomLevel( d->m_zoomFactor );
5773 QApplication::restoreOverrideCursor();
5778 for (; it !=
end; ++it ) {
5779 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5784 d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
5785 d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
5789 void KHTMLPart::slotIncFontSize()
5791 incFontSize(zoomSizes, zoomSizeCount);
5794 void KHTMLPart::slotDecFontSize()
5796 decFontSize(zoomSizes, zoomSizeCount);
5799 void KHTMLPart::slotIncFontSizeFast()
5801 incFontSize(fastZoomSizes, fastZoomSizeCount);
5804 void KHTMLPart::slotDecFontSizeFast()
5806 decFontSize(fastZoomSizes, fastZoomSizeCount);
5809 void KHTMLPart::incFontSize(
const int stepping[],
int count)
5811 int zoomFactor = d->m_fontScaleFactor;
5813 if (zoomFactor < maxZoom) {
5815 for (
int i = 0; i < count; ++i)
5816 if (stepping[i] > zoomFactor) {
5817 zoomFactor = stepping[i];
5824 void KHTMLPart::decFontSize(
const int stepping[],
int count)
5826 int zoomFactor = d->m_fontScaleFactor;
5827 if (zoomFactor > minZoom) {
5829 for (
int i = count-1; i >= 0; --i)
5830 if (stepping[i] < zoomFactor) {
5831 zoomFactor = stepping[i];
5840 if (percent < minZoom) percent =
minZoom;
5841 if (percent > maxZoom) percent =
maxZoom;
5842 if (d->m_fontScaleFactor == percent)
return;
5843 d->m_fontScaleFactor = percent;
5845 if (d->m_view && d->m_doc) {
5846 QApplication::setOverrideCursor( Qt::WaitCursor );
5847 if (d->m_doc->styleSelector())
5848 d->m_doc->styleSelector()->computeFontSizes(d->m_doc->logicalDpiY(), d->m_fontScaleFactor);
5849 d->m_doc->recalcStyle( NodeImpl::Force );
5850 QApplication::restoreOverrideCursor();
5855 for (; it !=
end; ++it ) {
5856 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5863 return d->m_fontScaleFactor;
5866 void KHTMLPart::slotZoomView(
int delta )
5874 void KHTMLPart::setStatusBarText(
const QString& text, StatusBarPriority p)
5876 if (!d->m_statusMessagesEnabled)
5879 d->m_statusBarText[p] = text;
5882 QString tobe = d->m_statusBarText[BarHoverText];
5884 tobe = d->m_statusBarText[BarOverrideText];
5885 if (tobe.isEmpty()) {
5886 tobe = d->m_statusBarText[BarDefaultText];
5887 if (!tobe.isEmpty() && d->m_jobspeed)
5894 emit ReadOnlyPart::setStatusBarText(tobe);
5900 setStatusBarText(text, BarOverrideText);
5905 setStatusBarText(text, BarDefaultText);
5910 return d->m_statusBarText[BarOverrideText];
5915 return d->m_statusBarText[BarDefaultText];
5920 return d->m_referrer;
5925 KUrl referrerURL =
KUrl( d->m_pageReferrer );
5926 if (referrerURL.isValid())
5930 if ((protocol ==
"http") ||
5931 ((protocol ==
"https") && (
url().protocol() ==
"https")))
5936 return referrerURL.
url();
5950 QDateTime lastModif = QFileInfo(
url().toLocalFile() ).lastModified();
5951 d->m_lastModified = lastModif.toString( Qt::LocalDate );
5954 return d->m_lastModified;
5957 void KHTMLPart::slotLoadImages()
5960 d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
5964 for (; it !=
end; ++it ) {
5965 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5966 p->slotLoadImages();
5970 void KHTMLPart::reparseConfiguration()
5977 d->m_doc->docLoader()->setShowAnimations( settings->
showAnimations() );
5986 delete d->m_settings;
5989 QApplication::setOverrideCursor( Qt::WaitCursor );
5990 khtml::CSSStyleSelector::reparseConfiguration();
5991 if(d->m_doc) d->m_doc->updateStyleSelector();
5992 QApplication::restoreOverrideCursor();
6014 for (; it !=
end; ++it )
6015 if (!(*it)->m_bPreloaded && (*it)->m_part)
6016 res += (*it)->m_name;
6027 for (; it !=
end; ++it )
6028 if (!(*it)->m_bPreloaded && (*it)->m_part)
6030 res.append( (*it)->m_part.data() );
6040 if ( it == d->m_frames.end() )
6045 emit d->m_extension->openUrlNotify();
6047 requestObject( *it, url, args, browserArgs );
6100 if (d->editor_context.m_selection.state() == Selection::CARET)
6102 if (!xmlDocImpl()->renderer())
6105 khtml::RenderObject::NodeInfo nodeInfo(
true,
true);
6106 xmlDocImpl()->renderer()->layer()->nodeAtPoint(nodeInfo, x, y);
6107 NodeImpl *innerNode = nodeInfo.innerNode();
6108 if (!innerNode || !innerNode->renderer())
6111 return innerNode->isPointInsideSelection(x, y, d->editor_context.m_selection);
6119 static bool firstRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&startNode,
long &startOffset)
6121 for (khtml::RenderObject *n = renderNode; n; n = n->nextSibling()) {
6123 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
6124 for (khtml::InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
6125 if (box->m_y == y && textRenderer->element()) {
6126 startNode = textRenderer->element();
6127 startOffset = box->m_start;
6133 if (
firstRunAt(n->firstChild(), y, startNode, startOffset)) {
6146 static bool lastRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&endNode,
long &endOffset)
6148 khtml::RenderObject *n = renderNode;
6152 khtml::RenderObject *
next;
6153 while ((next = n->nextSibling())) {
6158 if (
lastRunAt(n->firstChild(), y, endNode, endOffset)) {
6163 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
6164 for (khtml::InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
6165 if (box->m_y == y && textRenderer->element()) {
6166 endNode = textRenderer->element();
6167 endOffset = box->m_start + box->m_len;
6173 if (n == renderNode) {
6177 n = n->previousSibling();
6183 QMouseEvent *mouse =
event->qmouseEvent();
6184 DOM::Node innerNode =
event->innerNode();
6188 if (mouse->button() == Qt::LeftButton && !innerNode.
isNull() && innerNode.
handle()->renderer() &&
6189 innerNode.
handle()->renderer()->shouldSelect()) {
6190 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6191 if (pos.node() && (pos.node()->nodeType() == Node::TEXT_NODE || pos.node()->nodeType() == Node::CDATA_SECTION_NODE)) {
6192 selection.moveTo(pos);
6193 selection.expandUsingGranularity(Selection::WORD);
6197 if (selection.state() != Selection::CARET) {
6198 d->editor_context.beginSelectingText(Selection::WORD);
6201 setCaret(selection);
6207 QMouseEvent *mouse =
event->qmouseEvent();
6208 DOM::Node innerNode =
event->innerNode();
6212 if (mouse->button() == Qt::LeftButton && !innerNode.
isNull() && innerNode.
handle()->renderer() &&
6213 innerNode.
handle()->renderer()->shouldSelect()) {
6214 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6215 if (pos.node() && (pos.node()->nodeType() == Node::TEXT_NODE || pos.node()->nodeType() == Node::CDATA_SECTION_NODE)) {
6216 selection.moveTo(pos);
6217 selection.expandUsingGranularity(Selection::LINE);
6221 if (selection.state() != Selection::CARET) {
6222 d->editor_context.beginSelectingText(Selection::LINE);
6225 setCaret(selection);
6231 QMouseEvent *mouse =
event->qmouseEvent();
6232 DOM::Node innerNode =
event->innerNode();
6234 if (mouse->button() == Qt::LeftButton) {
6237 if (!innerNode.
isNull() && innerNode.
handle()->renderer() &&
6238 innerNode.
handle()->renderer()->shouldSelect()) {
6239 bool extendSelection = mouse->modifiers() & Qt::ShiftModifier;
6246 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6248 pos = Position(innerNode.
handle(), innerNode.
handle()->caretMinOffset());
6249 kDebug(6050) <<
event->x() <<
event->y() << pos << endl;
6252 if (extendSelection && sel.notEmpty()) {
6253 sel.clearModifyBias();
6255 if (d->editor_context.m_selectionGranularity != Selection::CHARACTER) {
6256 sel.expandUsingGranularity(d->editor_context.m_selectionGranularity);
6258 d->editor_context.m_beganSelectingText =
true;
6261 d->editor_context.m_selectionGranularity = Selection::CHARACTER;
6273 QMouseEvent *_mouse =
event->qmouseEvent();
6274 DOM::Node innerNode =
event->innerNode();
6275 d->m_mousePressNode = innerNode;
6277 d->m_dragStartPos =
QPoint(event->
x(),
event->y());
6280 d->m_strSelectedURL =
event->url().string();
6281 d->m_strSelectedURLTarget =
event->target().string();
6284 d->m_strSelectedURL.clear();
6285 d->m_strSelectedURLTarget.clear();
6288 if ( _mouse->button() == Qt::LeftButton ||
6289 _mouse->button() == Qt::MidButton )
6291 d->m_bMousePressed =
true;
6293 #ifdef KHTML_NO_SELECTION
6294 d->m_dragLastPos = _mouse->globalPos();
6296 if ( _mouse->button() == Qt::LeftButton )
6298 if ( (!d->m_strSelectedURL.isNull() && !
isEditable())
6299 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) )
6302 d->editor_context.m_beganSelectingText =
false;
6304 handleMousePressEventSingleClick(event);
6309 if ( _mouse->button() == Qt::RightButton )
6318 QMouseEvent *_mouse =
event->qmouseEvent();
6319 if ( _mouse->button() == Qt::LeftButton )
6321 d->m_bMousePressed =
true;
6322 d->editor_context.m_beganSelectingText =
false;
6325 handleMousePressEventDoubleClick(event);
6330 handleMousePressEventTripleClick(event);
6336 #ifndef KHTML_NO_SELECTION
6337 bool KHTMLPart::isExtendingSelection()
const
6342 return d->editor_context.m_beganSelectingText;
6345 void KHTMLPart::extendSelectionTo(
int x,
int y,
const DOM::Node &innerNode)
6348 Position pos(innerNode.
handle()->positionForCoordinates(x, y).position());
6356 Selection sel = caret();
6357 sel.clearModifyBias();
6358 if (!d->editor_context.m_beganSelectingText) {
6361 d->editor_context.beginSelectingText(Selection::CHARACTER);
6366 if (d->editor_context.m_selectionGranularity != Selection::CHARACTER) {
6367 sel.expandUsingGranularity(d->editor_context.m_selectionGranularity);
6372 #endif // KHTML_NO_SELECTION
6376 #ifdef QT_NO_DRAGANDDROP
6382 DOM::Node innerNode =
event->innerNode();
6384 if( (d->m_bMousePressed &&
6385 ( (!d->m_strSelectedURL.isEmpty() && !
isEditable())
6386 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) ) )
6392 HTMLImageElementImpl *img = 0L;
6401 img =
static_cast<HTMLImageElementImpl *
>(innerNode.
handle());
6402 u =
KUrl(
completeURL( khtml::parseURL(img->getAttribute(ATTR_SRC)).
string() ) );
6414 QDrag *drag =
new QDrag( d->m_view->viewport() );
6416 if ( !d->m_referrer.isEmpty() )
6417 metaDataMap.insert(
"referrer", d->m_referrer );
6418 QMimeData* mimeData =
new QMimeData();
6420 drag->setMimeData( mimeData );
6422 if( img && img->complete() )
6423 drag->mimeData()->setImageData( img->currentImage() );
6425 if ( !pix.isNull() )
6426 drag->setPixmap( pix );
6432 d->m_bMousePressed =
false;
6433 d->m_strSelectedURL.clear();
6434 d->m_strSelectedURLTarget.clear();
6438 #endif // QT_NO_DRAGANDDROP
6444 if ( d->m_bMousePressed )
return false;
6452 QMouseEvent *_mouse =
event->qmouseEvent();
6453 DOM::Node innerNode =
event->innerNode();
6455 bool shiftPressed = ( _mouse->modifiers() & Qt::ShiftModifier );
6460 HTMLImageElementImpl *i =
static_cast<HTMLImageElementImpl *
>(innerNode.
handle());
6461 if ( i && i->isServerMap() )
6463 khtml::RenderObject *r = i->renderer();
6467 r->absolutePosition(absx, absy);
6468 int x(event->
x() - absx), y(event->
y() - absy);
6470 d->m_overURL = url.
string() +
QString(
"?%1,%2").arg(x).arg(y);
6471 d->m_overURLTarget = target.
string();
6472 overURL( d->m_overURL, target.
string(), shiftPressed );
6479 if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
6481 d->m_overURL = url.
string();
6482 d->m_overURLTarget = target.
string();
6483 overURL( d->m_overURL, target.
string(), shiftPressed );
6488 if( !d->m_overURL.isEmpty() )
6500 if (!d->m_bMousePressed)
6503 #ifdef KHTML_NO_SELECTION
6504 if (d->m_doc && d->m_view) {
6505 QPoint diff( mouse->globalPos() - d->m_dragLastPos );
6507 if (abs(diff.x()) > 64 || abs(diff.y()) > 64) {
6508 d->m_view->scrollBy(-diff.x(), -diff.y());
6509 d->m_dragLastPos = mouse->globalPos();
6514 QMouseEvent *mouse =
event->qmouseEvent();
6515 DOM::Node innerNode =
event->innerNode();
6517 if ( (mouse->buttons() & Qt::LeftButton) == 0 || !innerNode.
handle() || !innerNode.
handle()->renderer() ||
6518 !innerNode.
handle()->renderer()->shouldSelect())
6522 extendSelectionTo(event->
x(),
event->y(), innerNode);
6523 #endif // KHTML_NO_SELECTION
6528 if (handleMouseMoveEventDrag(event))
6531 if (handleMouseMoveEventOver(event))
6534 handleMouseMoveEventSelection(event);
6539 DOM::Node innerNode =
event->innerNode();
6542 if ( d->m_bMousePressed ) {
6543 setStatusBarText(
QString(), BarHoverText);
6549 d->m_bMousePressed =
false;
6551 #ifndef QT_NO_CLIPBOARD
6552 QMouseEvent *_mouse =
event->qmouseEvent();
6554 kDebug( 6050 ) <<
"MMB shouldOpen=" << d->m_bOpenMiddleClick;
6556 if (d->m_bOpenMiddleClick) {
6564 #ifndef KHTML_NO_SELECTION
6570 if (!d->editor_context.m_beganSelectingText
6571 && d->m_dragStartPos.x() ==
event->x()
6572 && d->m_dragStartPos.y() ==
event->y()
6573 && d->editor_context.m_selection.state() == Selection::RANGE) {
6575 #ifdef APPLE_CHANGES
6576 if (d->editor_context.m_selection.base().node()->isContentEditable())
6578 selection.moveTo(d->editor_context.m_selection.base().node()->positionForCoordinates(event->
x(),
event->y()).position());
6579 setCaret(selection);
6582 #ifndef QT_NO_CLIPBOARD
6584 text.replace(QChar(0xa0),
' ');
6585 if (!text.isEmpty()) {
6586 disconnect( qApp->clipboard(), SIGNAL(
selectionChanged()),
this, SLOT(slotClearSelection()));
6587 qApp->clipboard()->setText(text,QClipboard::Selection);
6588 connect( qApp->clipboard(), SIGNAL(
selectionChanged()), SLOT(slotClearSelection()));
6592 emitSelectionChanged();
6606 emitSelectionChanged();
6607 emit d->m_extension->enableAction(
"print", d->m_doc != 0 );
6609 if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
6612 lst.append( d->m_paLoadImages );
6618 void KHTMLPart::slotPrintFrame()
6620 if ( d->m_frames.count() == 0 )
6633 const QMetaObject *mo = ext->metaObject();
6636 if (mo->indexOfSlot(
"print()") != -1)
6637 QMetaObject::invokeMethod(ext,
"print()", Qt::DirectConnection);
6640 void KHTMLPart::slotSelectAll()
6643 if (part && part->inherits(
"KHTMLPart"))
6644 static_cast<KHTMLPart *>(part)->selectAll();
6647 void KHTMLPart::startAutoScroll()
6649 connect(&d->m_scrollTimer, SIGNAL(
timeout()),
this, SLOT(slotAutoScroll()));
6650 d->m_scrollTimer.setSingleShot(
false);
6651 d->m_scrollTimer.start(100);
6654 void KHTMLPart::stopAutoScroll()
6656 disconnect(&d->m_scrollTimer, SIGNAL(
timeout()),
this, SLOT(slotAutoScroll()));
6657 if (d->m_scrollTimer.isActive())
6658 d->m_scrollTimer.stop();
6662 void KHTMLPart::slotAutoScroll()
6665 d->m_view->doAutoScroll();
6670 void KHTMLPart::runAdFilter()
6678 QSetIterator<khtml::CachedObject*> it( d->m_doc->docLoader()->m_docObjects );
6679 while (it.hasNext())
6681 khtml::CachedObject* obj = it.next();
6682 if ( obj->type() == khtml::CachedObject::Image ) {
6683 khtml::CachedImage *image =
static_cast<khtml::CachedImage *
>(obj);
6684 bool wasBlocked = image->m_wasBlocked;
6686 if ( image->m_wasBlocked != wasBlocked )
6687 image->do_notify(
QRect(
QPoint(0,0), image->pixmap_size()));
6692 for ( NodeImpl *nextNode, *node = d->m_doc; node; node = nextNode ) {
6695 nextNode = node->traverseNextNode();
6697 if ( node->id() == ID_IMG ||
6698 node->id() == ID_IFRAME ||
6699 (node->id() == ID_INPUT &&
static_cast<HTMLInputElementImpl *
>(node)->inputType() == HTMLInputElementImpl::IMAGE ))
6705 while (nextNode && nextNode->isAncestor(node))
6706 nextNode = nextNode->traverseNextNode();
6709 NodeImpl *parent = node->parent();
6713 parent->removeChild(node, exception);
6724 if (!d->m_doc)
return;
6727 if (d->m_doc->isHTMLDocument())
6728 first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6735 while ( first && !(first->renderer()
6736 && ((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE)
6737 || (first->renderer()->isReplaced() && !first->renderer()->firstChild()))))
6739 next = first->firstChild();
6740 if ( !next ) next = first->nextSibling();
6741 while( first && !next )
6743 first = first->parentNode();
6745 next = first->nextSibling();
6751 if (d->m_doc->isHTMLDocument())
6752 last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6759 while ( last && !(last->renderer()
6760 && ((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE)
6761 || (last->renderer()->isReplaced() && !last->renderer()->lastChild()))))
6763 next = last->lastChild();
6764 if ( !next ) next = last->previousSibling();
6765 while ( last && !next )
6767 last = last->parentNode();
6769 next = last->previousSibling();
6774 if ( !first || !last )
6776 Q_ASSERT(first->renderer());
6777 Q_ASSERT(last->renderer());
6778 d->editor_context.m_selection.moveTo(Position(first, 0), Position(last, last->nodeValue().length()));
6779 d->m_doc->updateSelection();
6781 emitSelectionChanged();
6786 bool linkAllowed =
true;
6791 if ( !linkAllowed ) {
6792 khtml::Tokenizer *tokenizer = d->m_doc->tokenizer();
6794 tokenizer->setOnHold(
true);
6802 i18n(
"Security Warning" ),
6811 i18n(
"<qt>Access by untrusted page to<br /><b>%1</b><br /> denied.</qt>", Qt::escape(linkURL.
prettyUrl())),
6812 i18n(
"Security Alert" ));
6816 tokenizer->setOnHold(
false);
6825 if ( part == d->m_activeFrame )
6827 d->m_activeFrame = 0L;
6828 if ( !part->inherits(
"KHTMLPart" ) )
6840 void KHTMLPart::slotActiveFrameChanged(
KParts::Part *part )
6845 kError(6050) <<
"strange error! we activated ourselves";
6850 if ( d->m_activeFrame && d->m_activeFrame->widget() && d->m_activeFrame->widget()->inherits(
"QFrame" ) )
6852 QFrame *frame =
static_cast<QFrame *
>( d->m_activeFrame->widget() );
6853 if (frame->frameStyle() != QFrame::NoFrame)
6855 frame->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken);
6860 if( d->m_activeFrame && !d->m_activeFrame->inherits(
"KHTMLPart" ) )
6867 if( part && !part->inherits(
"KHTMLPart" ) )
6876 d->m_activeFrame = part;
6878 if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits(
"QFrame" ) )
6880 QFrame *frame =
static_cast<QFrame *
>( d->m_activeFrame->widget() );
6881 if (frame->frameStyle() != QFrame::NoFrame)
6883 frame->setFrameStyle( QFrame::StyledPanel | QFrame::Plain);
6886 kDebug(6050) <<
"new active frame " << d->m_activeFrame;
6897 if (!d->m_doc || !d->m_view)
6901 d->m_doc->setFocusNode(node.
handle());
6905 d->m_view->ensureVisible(rect.right(), rect.bottom());
6906 d->m_view->ensureVisible(rect.left(), rect.top());
6911 return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
6921 return proxy->createHTMLEventHandler(
url().
url(), name, code, node, svg );
6929 void KHTMLPart::setOpener(
KHTMLPart *_opener)
6931 d->m_opener = _opener;
6934 bool KHTMLPart::openedByJS()
6936 return d->m_openedByJS;
6939 void KHTMLPart::setOpenedByJS(
bool _openedByJS)
6941 d->m_openedByJS = _openedByJS;
6954 long KHTMLPart::cacheId()
const
6956 return d->m_cacheId;
6961 return d->m_restored;
6971 return d->m_pluginPageQuestionAsked.contains(mimetype);
6979 d->m_pluginPageQuestionAsked.append(mimetype);
6985 if( !d->m_encoding.isNull() )
6986 dec->
setEncoding( d->m_encoding.toLatin1().constData(),
6996 d->m_doc->setDecoder(dec);
7001 void KHTMLPart::emitCaretPositionChanged(
const DOM::Position &pos) {
7003 Position rng_pos = pos.equivalentRangeCompliantPosition();
7004 Node node = rng_pos.node();
7008 void KHTMLPart::restoreScrollPosition()
7012 if (
url().hasRef() && !d->m_restoreScrollPosition && !args.
reload()) {
7013 if ( !d->m_doc || !d->m_doc->parsing() )
7014 disconnect(d->m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
7024 if (d->m_view->contentsHeight() - d->m_view->visibleHeight() >= args.
yOffset()
7025 || d->m_bComplete) {
7027 disconnect(d->m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
7032 void KHTMLPart::openWallet(DOM::HTMLFormElementImpl *form)
7034 #ifndef KHTML_NO_WALLET
7041 p->openWallet(form);
7050 if (d->m_bWalletOpened) {
7051 if (d->m_wallet->isOpen()) {
7052 form->walletOpened(d->m_wallet);
7055 d->m_wallet->deleteLater();
7057 d->m_bWalletOpened =
false;
7064 d->m_wq->wallet = wallet;
7065 connect(wallet, SIGNAL(walletOpened(
bool)), d->m_wq, SLOT(walletOpened(
bool)));
7070 #endif // KHTML_NO_WALLET
7076 #ifndef KHTML_NO_WALLET
7083 p->saveToWallet(key, data);
7088 if (d->m_bWalletOpened) {
7089 if (d->m_wallet->isOpen()) {
7094 d->m_wallet->writeMap(key, data);
7097 d->m_wallet->deleteLater();
7099 d->m_bWalletOpened =
false;
7106 d->m_wq->wallet = wallet;
7107 connect(wallet, SIGNAL(walletOpened(
bool)), d->m_wq, SLOT(walletOpened(
bool)));
7110 d->m_wq->savers.append(qMakePair(key, data));
7111 #endif // KHTML_NO_WALLET
7115 void KHTMLPart::dequeueWallet(DOM::HTMLFormElementImpl *form) {
7116 #ifndef KHTML_NO_WALLET
7123 p->dequeueWallet(form);
7130 #endif // KHTML_NO_WALLET
7135 #ifndef KHTML_NO_WALLET
7139 d->m_wq->deleteLater();
7143 d->m_bWalletOpened =
false;
7147 d->m_wallet = wallet;
7148 d->m_bWalletOpened =
true;
7149 connect(d->m_wallet, SIGNAL(walletClosed()), SLOT(slotWalletClosed()));
7150 d->m_walletForms.clear();
7151 if (!d->m_statusBarWalletLabel) {
7152 d->m_statusBarWalletLabel =
new KUrlLabel(d->m_statusBarExtension->statusBar());
7153 d->m_statusBarWalletLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum));
7155 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarWalletLabel, 0,
false);
7156 d->m_statusBarWalletLabel->setPixmap(
SmallIcon(
"wallet-open"));
7157 connect(d->m_statusBarWalletLabel, SIGNAL(leftClickedUrl()), SLOT(launchWalletManager()));
7158 connect(d->m_statusBarWalletLabel, SIGNAL(rightClickedUrl()), SLOT(walletMenu()));
7161 #endif // KHTML_NO_WALLET
7167 #ifndef KHTML_NO_WALLET
7179 #endif // !KHTML_NO_WALLET
7183 void KHTMLPart::slotWalletClosed()
7185 #ifndef KHTML_NO_WALLET
7187 d->m_wallet->deleteLater();
7190 d->m_bWalletOpened =
false;
7191 if (d->m_statusBarWalletLabel) {
7192 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarWalletLabel);
7193 delete d->m_statusBarWalletLabel;
7194 d->m_statusBarWalletLabel = 0L;
7196 #endif // KHTML_NO_WALLET
7199 void KHTMLPart::launchWalletManager()
7201 #ifndef KHTML_NO_WALLET
7202 QDBusInterface r(
"org.kde.kwalletmanager",
"/kwalletmanager/MainWindow_1",
7203 "org.kde.KMainWindow");
7207 r.call(QDBus::NoBlock,
"show");
7208 r.call(QDBus::NoBlock,
"raise");
7210 #endif // KHTML_NO_WALLET
7213 void KHTMLPart::walletMenu()
7215 #ifndef KHTML_NO_WALLET
7217 QActionGroup *menuActionGroup =
new QActionGroup(menu);
7218 connect( menuActionGroup, SIGNAL(triggered(
QAction*)),
this, SLOT(removeStoredPasswordForm(
QAction*)) );
7220 menu->addAction(
i18n(
"&Close Wallet"),
this, SLOT(slotWalletClosed()));
7222 if (d->m_view && d->m_view->nonPasswordStorableSite(
toplevelURL().host())) {
7223 menu->addAction(
i18n(
"&Allow storing passwords for this site"),
this, SLOT(delNonPasswordStorableSite()));
7227 for ( QStringList::ConstIterator it = d->m_walletForms.constBegin(); it != d->m_walletForms.constEnd(); ++it ) {
7228 QAction* action = menu->addAction(
i18n(
"Remove password for form %1", *it) );
7229 action->setActionGroup(menuActionGroup);
7231 action->setData(var);
7235 menu->popup(QCursor::pos());
7236 #endif // KHTML_NO_WALLET
7239 void KHTMLPart::removeStoredPasswordForm(
QAction* action)
7241 #ifndef KHTML_NO_WALLET
7260 if (d->m_wallet->removeEntry(key))
7263 d->m_walletForms.removeAll(key);
7264 #endif // KHTML_NO_WALLET
7267 void KHTMLPart::addWalletFormKey(
const QString& walletFormKey)
7269 #ifndef KHTML_NO_WALLET
7272 parentPart()->addWalletFormKey(walletFormKey);
7276 if(!d->m_walletForms.contains(walletFormKey))
7277 d->m_walletForms.append(walletFormKey);
7278 #endif // KHTML_NO_WALLET
7281 void KHTMLPart::delNonPasswordStorableSite()
7283 #ifndef KHTML_NO_WALLET
7285 d->m_view->delNonPasswordStorableSite(
toplevelURL().host());
7286 #endif // KHTML_NO_WALLET
7290 #ifndef KHTML_NO_WALLET
7291 d->m_storePass.saveLoginInformation(host, key, walletMap);
7292 #endif // KHTML_NO_WALLET
7295 void KHTMLPart::slotToggleCaretMode()
7301 d->m_formNotification = fn;
7305 return d->m_formNotification;
7325 return d->m_doc->unsubmittedFormChanges();
7328 void KHTMLPart::setDebugScript(
bool enable )
7332 if (!d->m_paDebugScript) {
7333 d->m_paDebugScript =
new KAction(
i18n(
"JavaScript &Debugger" ),
this );
7335 connect( d->m_paDebugScript, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugScript()) );
7337 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
7339 lst.append( d->m_paDebugScript );
7342 d->m_bJScriptDebugEnabled = enable;
7352 if ( enable && originPart ) {
7353 d->m_openableSuppressedPopups++;
7354 if ( d->m_suppressedPopupOriginParts.indexOf( originPart ) == -1 )
7355 d->m_suppressedPopupOriginParts.append( originPart );
7358 if ( enable && !d->m_statusBarPopupLabel ) {
7359 d->m_statusBarPopupLabel =
new KUrlLabel( d->m_statusBarExtension->statusBar() );
7360 d->m_statusBarPopupLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum ));
7362 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarPopupLabel, 0,
false );
7363 d->m_statusBarPopupLabel->setPixmap(
SmallIcon(
"window-suppressed") );
7365 d->m_statusBarPopupLabel->setToolTip(
i18n(
"This page was prevented from opening a new window via JavaScript." ) );
7367 connect(d->m_statusBarPopupLabel, SIGNAL(leftClickedUrl()), SLOT(suppressedPopupMenu()));
7368 if (d->m_settings->jsPopupBlockerPassivePopup()) {
7371 KPassivePopup::message(
i18n(
"Popup Window Blocked"),
i18n(
"This page has attempted to open a popup window but was blocked.\nYou can click on this icon in the status bar to control this behavior\nor to open the popup."),px,d->m_statusBarPopupLabel);
7373 }
else if ( !enable && d->m_statusBarPopupLabel ) {
7374 d->m_statusBarPopupLabel->setToolTip(
"" );
7375 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarPopupLabel );
7376 delete d->m_statusBarPopupLabel;
7377 d->m_statusBarPopupLabel = 0L;
7381 void KHTMLPart::suppressedPopupMenu() {
7383 if ( d->m_openableSuppressedPopups )
7384 m->addAction(
i18np(
"&Show Blocked Popup Window",
"&Show %1 Blocked Popup Windows", d->m_openableSuppressedPopups),
this, SLOT(showSuppressedPopups()));
7385 QAction *a = m->addAction(
i18n(
"Show Blocked Window Passive Popup &Notification"),
this, SLOT(togglePopupPassivePopup()));
7386 a->setChecked(d->m_settings->jsPopupBlockerPassivePopup());
7387 m->addAction(
i18n(
"&Configure JavaScript New Window Policies..."),
this, SLOT(launchJSConfigDialog()));
7388 m->popup(QCursor::pos());
7391 void KHTMLPart::togglePopupPassivePopup() {
7393 d->m_settings->setJSPopupBlockerPassivePopup( !d->m_settings->jsPopupBlockerPassivePopup() );
7397 void KHTMLPart::showSuppressedPopups() {
7398 foreach (
KHTMLPart* part, d->m_suppressedPopupOriginParts ) {
7400 KJS::Window *w = KJS::Window::retrieveWindow( part );
7402 w->showSuppressedWindows();
7403 w->forgetSuppressedWindows();
7408 d->m_openableSuppressedPopups = 0;
7409 d->m_suppressedPopupOriginParts.clear();
7414 QString KHTMLPart::defaultExtension()
const
7418 if ( !d->m_doc->isHTMLDocument() )
7420 return d->m_doc->htmlMode() == DOM::DocumentImpl::XHtml ?
".xhtml" :
".html";
7425 if (!d->m_bComplete || d->m_runningScripts || (d->m_doc && d->m_doc->parsing()))
7431 for (; it !=
end; ++it ) {
7432 if ((*it)->m_run || !(*it)->m_bCompleted)
7436 return d->m_submitForm || !d->m_redirectURL.isEmpty() || d->m_redirectionTimer.isActive() || d->m_job;
7439 using namespace KParts;
7440 #include "khtml_part.moc"
7441 #include "khtmlpart_p.moc"
7442 #ifndef KHTML_NO_WALLET
7443 #include "khtml_wallet_p.moc"