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"
69 #include "ecma/kjs_events.h"
73 #include <kjs/function.h>
74 #include <kjs/interpreter.h>
76 #include <sys/types.h>
106 #include <kde_file.h>
120 #include <QtGui/QClipboard>
121 #include <QtGui/QToolTip>
122 #include <QtCore/QFile>
123 #include <QtCore/QMetaEnum>
124 #include <QtGui/QTextDocument>
125 #include <QtCore/QDate>
126 #include <QtNetwork/QSslCertificate>
132 #include "rendering/render_form.h"
136 #include "ecma/debugger/debugwindow.h"
152 class PartStyleSheetLoader :
public CachedObjectClient
158 m_cachedSheet = dl->requestStyleSheet(url,
QString(),
"text/css",
161 m_cachedSheet->ref(
this );
163 virtual ~PartStyleSheetLoader()
165 if ( m_cachedSheet ) m_cachedSheet->deref(
this);
174 virtual void error(
int,
const QString& ) {
177 QPointer<KHTMLPart> m_part;
178 khtml::CachedCSSStyleSheet *m_cachedSheet;
188 init(
new KHTMLView(
this, parentWidget ), prof );
199 view->setPart(
this );
203 void KHTMLPart::init(
KHTMLView *view, GUIProfile prof )
216 widget->setObjectName(
"khtml_part_widget");
217 QVBoxLayout *layout =
new QVBoxLayout( widget );
218 layout->setContentsMargins( 0, 0, 0, 0 );
219 layout->setSpacing( 0 );
220 widget->setLayout( layout );
226 layout->addWidget( d->
m_view );
229 widget->setFocusProxy( d->
m_view );
236 d->
m_extension->setObjectName(
"KHTMLBrowserExtension" );
254 connect( d->
m_paViewDocument, SIGNAL(triggered(
bool)),
this, SLOT(slotViewDocumentSource()) );
261 connect( d->
m_paViewFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotViewFrameSource()) );
271 connect( d->
m_paViewInfo, SIGNAL(triggered(
bool)),
this, SLOT(slotViewPageInfo()) );
275 connect( d->
m_paSaveBackground, SIGNAL(triggered(
bool)),
this, SLOT(slotSaveBackground()) );
278 this, SLOT(slotSaveDocument()) );
284 connect( d->
m_paSaveFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotSaveFrame()) );
296 connect( d->
m_paSecurity, SIGNAL(triggered(
bool)),
this, SLOT(slotSecurity()) );
300 connect( d->
m_paDebugRenderTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugRenderTree()) );
304 connect( d->
m_paDebugDOMTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugDOMTree()) );
306 KAction* paDebugFrameTree =
new KAction(
i18n(
"Print frame tree to STDOUT" ),
this );
308 connect( paDebugFrameTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugFrameTree()) );
312 connect( d->
m_paStopAnimations, SIGNAL(triggered(
bool)),
this, SLOT(slotStopAnimations()) );
321 if ( KGlobal::config()->hasGroup(
"HTML Settings" ) ) {
326 const QByteArray
name = KGlobal::locale()->encoding().toLower();
328 if (name.endsWith(
"1251")||name.startsWith(
"koi")||name==
"iso-8859-5")
330 else if (name.endsWith(
"1256")||name==
"iso-8859-6")
332 else if (name.endsWith(
"1257")||name==
"iso-8859-13"||name==
"iso-8859-4")
334 else if (name.endsWith(
"1250")|| name==
"ibm852" || name==
"iso-8859-2" || name==
"iso-8859-3" )
336 else if (name.endsWith(
"1253")|| name==
"iso-8859-7" )
338 else if (name.endsWith(
"1255")|| name==
"iso-8859-8" || name==
"iso-8859-8-i" )
340 else if (name==
"jis7" || name==
"eucjp" || name==
"sjis" )
342 else if (name.endsWith(
"1254")|| name==
"iso-8859-9" )
344 else if (name.endsWith(
"1252")|| name==
"iso-8859-1" || name==
"iso-8859-15" )
355 connect( d->
m_paUseStylesheet, SIGNAL(triggered(
int)),
this, SLOT(slotUseStylesheet()) );
360 connect(d->
m_paIncZoomFactor, SIGNAL(triggered(
bool)), SLOT(slotIncFontSizeFast()));
362 "Make the font in this window bigger. "
363 "Click and hold down the mouse button for a menu with all available font sizes.</qt>" ) );
367 connect(d->
m_paDecZoomFactor, SIGNAL(triggered(
bool)), SLOT(slotDecFontSizeFast()));
369 "Make the font in this window smaller. "
370 "Click and hold down the mouse button for a menu with all available font sizes.</qt>" ) );
383 d->
m_paFind->setWhatsThis(
i18n(
"<qt>Find text<br /><br />"
384 "Shows a dialog that allows you to find text on the displayed page.</qt>" ) );
388 "Find the next occurrence of the text that you "
389 "have found using the <b>Find Text</b> function.</qt>" ) );
392 this, SLOT(slotFindPrev()) );
394 "Find the previous occurrence of the text that you "
395 "have found using the <b>Find Text</b> function.</qt>" ) );
401 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."));
402 connect( d->
m_paFindAheadText, SIGNAL(triggered(
bool)),
this, SLOT(slotFindAheadText()) );
411 connect( d->
m_paFindAheadLinks, SIGNAL(triggered(
bool)),
this, SLOT(slotFindAheadLink()) );
425 connect( d->
m_paPrintFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotPrintFrame()) );
427 "Some pages have several frames. To print only a single frame, click "
428 "on it and then use this function.</qt>" ) );
436 this, SLOT(slotSelectAll()) );
443 connect( d->
m_paToggleCaretMode, SIGNAL(triggered(
bool)),
this, SLOT(slotToggleCaretMode()) );
484 action->setShortcutContext ( Qt::WidgetWithChildrenShortcut );
488 connect( view, SIGNAL(zoomView(
int)), SLOT(slotZoomView(
int)) );
491 this, SLOT(updateActions()) );
493 this, SLOT(updateActions()) );
495 this, SLOT(updateActions()) );
500 connect( khtml::Cache::loader(), SIGNAL(requestStarted(khtml::DocLoader*,khtml::CachedObject*)),
501 this, SLOT(slotLoaderRequestStarted(khtml::DocLoader*,khtml::CachedObject*)) );
502 connect( khtml::Cache::loader(), SIGNAL(requestDone(khtml::DocLoader*,khtml::CachedObject*)),
503 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
504 connect( khtml::Cache::loader(), SIGNAL(requestFailed(khtml::DocLoader*,khtml::CachedObject*)),
505 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
512 this, SLOT(slotRedirect()) );
514 if (QDBusConnection::sessionBus().isConnected()) {
516 for (
int i = 1; ; ++i)
517 if (QDBusConnection::sessionBus().registerObject(
QString(
"/KHTML/%1/widget").arg(i),
this))
519 else if (i == 0xffff)
520 kFatal() <<
"Something is very wrong in KHTMLPart!";
530 KGlobal::locale()->removeCatalog(
"khtml");
545 removeJSErrorExtension();
554 disconnect( khtml::Cache::loader(), SIGNAL(requestStarted(khtml::DocLoader*,khtml::CachedObject*)),
555 this, SLOT(slotLoaderRequestStarted(khtml::DocLoader*,khtml::CachedObject*)) );
556 disconnect( khtml::Cache::loader(), SIGNAL(requestDone(khtml::DocLoader*,khtml::CachedObject*)),
557 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
558 disconnect( khtml::Cache::loader(), SIGNAL(requestFailed(khtml::DocLoader*,khtml::CachedObject*)),
559 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
577 d->
m_frame->m_run.data()->abort();
582 bool KHTMLPart::restoreURL(
const KUrl &url )
611 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
612 connect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
625 if (url.
protocol() == QLatin1String(
"help"))
640 if ((oldRef != newRef) || (oldRef.isNull() && newRef.isEmpty())) {
641 DOM::HashChangeEventImpl *evImpl =
new DOM::HashChangeEventImpl();
642 evImpl->initHashChangeEvent(
"hashchange",
648 m_doc->dispatchWindowEvent(evImpl);
660 kDebug( 6050 ) <<
this <<
"opening" <<
url;
688 if ( !urls.isEmpty() ) {
689 const KUrl mainURL = urls.first();
690 int error = mainURL.
queryItem(
"error" ).toInt();
692 if ( error == 0 ) error = KIO::ERR_UNKNOWN;
709 d->
m_statusBarUALabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum));
733 bool isFrameSet =
false;
734 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
735 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
736 isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
743 for (; it !=
end; ++it) {
758 if ( url.
hasRef() && !isFrameSet )
760 bool noReloadForced = !args.reload() && !browserArgs.redirectedRequest() && !browserArgs.doPost();
763 kDebug( 6050 ) <<
"jumping to anchor. m_url = " <<
url;
772 d->
m_doc->setParsing(
false);
774 kDebug( 6050 ) <<
"completed...";
783 args.setXOffset( d->
m_view->contentsX() );
784 args.setYOffset( d->
m_view->contentsY() );
792 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
793 connect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
804 begin(url, args.xOffset(), args.yOffset());
805 write(QString::fromLatin1(
"<html><head></head><body>"));
807 write(QString::fromLatin1(
"<img "));
809 write(QString::fromLatin1(
"<embed "));
810 write(QString::fromLatin1(
"src=\""));
815 write(QString::fromLatin1(
"\">"));
824 if(url.
protocol().startsWith(
"http" ) && !url.host().isEmpty() &&
825 url.
path().isEmpty()) {
832 metaData.insert(
"main_frame_request",
parentPart() == 0 ?
"TRUE" :
"FALSE" );
835 metaData.insert(
"PropagateHttpHeader",
"true");
836 metaData.insert(
"ssl_was_in_use", d->
m_ssl_in_use ?
"TRUE" :
"FALSE" );
837 metaData.insert(
"ssl_activate_warnings",
"TRUE" );
845 else if (args.reload() && !browserArgs.softReload)
850 if ( browserArgs.doPost() && (url.
protocol().startsWith(
"http")) )
852 d->
m_job = KIO::http_post( url, browserArgs.postData, KIO::HideProgressInfo );
853 d->
m_job->addMetaData(
"content-type", browserArgs.contentType() );
857 d->
m_job = KIO::get( url, KIO::NoReload, KIO::HideProgressInfo );
862 d->
m_job->ui()->setWindow(
widget()->topLevelWidget());
863 d->
m_job->addMetaData(metaData);
865 connect( d->
m_job, SIGNAL(result(
KJob*)),
868 SLOT(slotData(
KIO::Job*,QByteArray)) );
890 connect( d->
m_job, SIGNAL(speed(
KJob*,ulong)),
891 this, SLOT(slotJobSpeed(
KJob*,ulong)) );
893 connect( d->
m_job, SIGNAL(percent(
KJob*,ulong)),
894 this, SLOT(slotJobPercent(
KJob*,ulong)) );
896 connect( d->
m_job, SIGNAL(result(
KJob*)),
897 this, SLOT(slotJobDone(
KJob*)) );
905 KIO::StatJob *job = KIO::stat( url, KIO::HideProgressInfo );
906 connect( job, SIGNAL(result(
KJob*)),
907 this, SLOT(slotUserSheetStatDone(
KJob*)) );
924 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
925 HTMLDocumentImpl* hdoc =
static_cast<HTMLDocumentImpl*
>( d->
m_doc );
928 hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT,
false,
false );
930 d->
m_doc->updateRendering();
939 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
944 kDebug( 6050 ) <<
" was still parsing... calling end ";
945 slotFinishedParsing();
946 d->
m_doc->setParsing(
false);
952 kDebug( 6050 ) <<
"Aborted before starting to render, reverting location bar to " <<
url().
prettyUrl();
959 khtml::Cache::loader()->cancelRequests( d->
m_doc->docLoader() );
965 for (; it !=
end; ++it )
968 (*it)->m_run.data()->abort();
969 if ( !( *it )->m_part.isNull() )
970 ( *it )->m_part.data()->closeUrl();
977 for (; it !=
end; ++it)
979 if ( !( *it )->m_part.isNull() )
980 ( *it )->m_part.data()->closeUrl();
992 d->
m_view->closeChildDialogs();
1000 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
1002 return static_cast<HTMLDocumentImpl*
>(0);
1015 QByteArray sourceArray;
1016 QDataStream dataStream( &sourceArray, QIODevice::WriteOnly );
1018 QTextStream stream( sourceArray, QIODevice::ReadOnly );
1019 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1020 sourceStr = stream.readAll();
1027 if ( f.open( QIODevice::ReadOnly ) )
1029 QTextStream stream( &f );
1030 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1031 sourceStr = stream.readAll();
1059 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1066 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1079 if (!proxy || proxy->paused())
1082 return proxy->interpreter();
1093 d->
m_frame->m_jscript->clear();
1131 KJSProxy *KHTMLPart::jScript()
1143 for (; it !=
end; ++it)
1144 if ((*it)->m_part.data() ==
this) {
1163 QString trg = target.toLower();
1165 if (target ==
"_top") {
1169 else if (target ==
"_parent") {
1173 else if (target ==
"_self" || target ==
"_blank") {
1183 if (destpart ==
this)
1187 if (destpart->checkFrameAccess(
this))
1220 d->
m_jsedlg->_clear->setIcon(
KIcon(
"edit-clear-locationbar-ltr"));
1227 void KHTMLPart::removeJSErrorExtension() {
1241 void KHTMLPart::disableJSErrorExtension() {
1242 removeJSErrorExtension();
1251 void KHTMLPart::jsErrorDialogContextMenu() {
1253 m->addAction(
i18n(
"&Hide Errors"),
this, SLOT(removeJSErrorExtension()));
1254 m->addAction(
i18n(
"&Disable Error Reporting"),
this, SLOT(disableJSErrorExtension()));
1255 m->popup(QCursor::pos());
1258 void KHTMLPart::launchJSErrorDialog() {
1266 void KHTMLPart::launchJSConfigDialog() {
1268 args <<
"khtml_java_js";
1276 kDebug(6070) <<
"executeScript: caller='" << objectName() <<
"' filename=" << filename <<
" baseLine=" << baseLine ;
1280 if (!proxy || proxy->paused())
1284 (void)proxy->interpreter();
1286 KJS::Completion comp;
1288 QVariant ret = proxy->evaluate(filename, baseLine, script, n, &comp);
1293 if (comp.complType() == KJS::Throw && comp.value()) {
1296 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1297 proxy->interpreter()->globalExec(), comp.value());
1299 Qt::escape(filename), Qt::escape(msg)));
1306 kDebug(6070) <<
"executeScript done, handling immediate redirection NOW";
1308 khtml::Tokenizer* t = d->
m_doc->tokenizer();
1330 if (!proxy || proxy->paused())
1332 (void)proxy->interpreter();
1335 KJS::Completion comp;
1336 const QVariant ret = proxy->evaluate(
QString(), 1, script, n, &comp );
1342 if (comp.complType() == KJS::Throw && comp.value()) {
1345 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1346 proxy->interpreter()->globalExec(), comp.value());
1347 dlg->
addError(
i18n(
"<qt><b>Error</b>: node %1: %2</qt>",
1397 void KHTMLPart::slotDebugDOMTree()
1400 qDebug(
"%s", d->
m_doc->toString().string().toLatin1().constData());
1408 for (; it !=
end; ++it )
1409 if ( !( *it )->m_part.isNull() && (*it)->m_part.data()->inherits(
"KHTMLPart" ) ) {
1412 static_cast<KHTMLPart*
>( p )->slotDebugDOMTree();
1417 void KHTMLPart::slotDebugScript()
1420 jScript()->showDebugWindow();
1423 void KHTMLPart::slotDebugRenderTree()
1427 d->
m_doc->renderer()->printTree();
1438 void KHTMLPart::slotDebugFrameTree()
1443 void KHTMLPart::slotStopAnimations()
1450 if ( d->
m_doc && d->
m_doc->docLoader()->autoloadImages() == enable )
1454 d->
m_doc->docLoader()->setAutoloadImages( enable );
1466 connect( d->
m_paLoadImages, SIGNAL(triggered(
bool)),
this, SLOT(slotLoadImages()) );
1479 return d->
m_doc->docLoader()->autoloadImages();
1484 void KHTMLPart::clear()
1496 for(; it !=
end; ++it )
1500 (*it)->m_run.data()->abort();
1507 for(; it !=
end; ++it )
1511 (*it)->m_run.data()->abort();
1522 if (d->
m_doc->attached())
1528 d->
m_frame->m_jscript->clear();
1531 if (d->
m_doc && d->
m_doc->renderer() && d->
m_doc->renderer()->layer())
1532 d->
m_doc->renderer()->layer()->suspendMarquees();
1559 for(; it !=
end; ++it )
1561 if ( (*it)->m_part )
1564 delete (*it)->m_part.data();
1578 for (; oi != oiEnd; ++oi )
1580 delete (*oi)->m_part.data();
1602 #ifndef QT_NO_CLIPBOARD
1603 connect( qApp->clipboard(), SIGNAL(
selectionChanged()), SLOT(slotClearSelection()));
1631 DOM::HTMLDocumentImpl *KHTMLPart::docImpl()
const
1633 if ( d && d->
m_doc && d->
m_doc->isHTMLDocument() )
1634 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
1638 DOM::DocumentImpl *KHTMLPart::xmlDocImpl()
const
1645 void KHTMLPart::slotInfoMessage(
KJob* kio_job,
const QString& msg)
1652 setStatusBarText(msg, BarDefaultText);
1660 void KHTMLPart::slotData(
KIO::Job* kio_job,
const QByteArray &data )
1685 d->
m_doc->docLoader()->setCachePolicy(KIO::CC_Verify);
1695 time_t cacheCreationDate = d->
m_job->queryMetaData(
"cache-creation-date").toLong();
1696 d->
m_doc->docLoader()->setCacheCreationDate(cacheCreationDate);
1731 qData = d->
m_job->queryMetaData(
"http-refresh");
1732 if( !qData.isEmpty())
1733 d->
m_doc->processHttpEquiv(
"refresh", qData);
1744 QString language = d->
m_job->queryMetaData(
"content-language");
1745 if (!language.isEmpty())
1746 d->
m_doc->setContentLanguage(language);
1748 if ( !
url().isLocalFile() )
1758 write( data.data(), data.size() );
1761 void KHTMLPart::slotRestoreData(
const QByteArray &data )
1777 write( data.data(), data.size() );
1779 if (data.size() == 0)
1793 if (job->error() == KIO::ERR_NO_CONTENT)
1797 job->uiDelegate()->showErrorMessage();
1807 kDebug(6050) <<
"errorCode" << errorCode <<
"text" << text;
1815 QString errorName, techName, description;
1818 QByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
1819 QDataStream stream(raw);
1821 stream >> errorName >> techName >> description >> causes >> solutions;
1827 url = Qt::escape( Qt::escape( reqUrl.
prettyUrl() ) );
1829 datetime = KGlobal::locale()->formatDateTime( QDateTime::currentDateTime(),
1833 QFile file( filename );
1834 bool isOpened = file.open( QIODevice::ReadOnly );
1836 kWarning(6050) <<
"Could not open error html template:" << filename;
1840 html.replace( QLatin1String(
"TITLE" ),
i18n(
"Error: %1 - %2", errorName, url ) );
1841 html.replace( QLatin1String(
"DIRECTION" ), QApplication::isRightToLeft() ?
"rtl" :
"ltr" );
1844 QString doc = QLatin1String(
"<h1>" );
1845 doc +=
i18n(
"The requested operation could not be completed" );
1846 doc += QLatin1String(
"</h1><h2>" );
1848 doc += QLatin1String(
"</h2>" );
1849 if ( !techName.isNull() ) {
1850 doc += QLatin1String(
"<h2>" );
1851 doc +=
i18n(
"Technical Reason: " );
1853 doc += QLatin1String(
"</h2>" );
1855 doc += QLatin1String(
"<br clear=\"all\">" );
1856 doc += QLatin1String(
"<h3>" );
1857 doc +=
i18n(
"Details of the Request:" );
1858 doc += QLatin1String(
"</h3><ul><li>" );
1859 doc +=
i18n(
"URL: %1" , url );
1860 doc += QLatin1String(
"</li><li>" );
1861 if ( !protocol.isNull() ) {
1862 doc +=
i18n(
"Protocol: %1", protocol );
1863 doc += QLatin1String(
"</li><li>" );
1865 doc +=
i18n(
"Date and Time: %1" , datetime );
1866 doc += QLatin1String(
"</li><li>" );
1867 doc +=
i18n(
"Additional Information: %1" , text );
1868 doc += QLatin1String(
"</li></ul><h3>" );
1869 doc +=
i18n(
"Description:" );
1870 doc += QLatin1String(
"</h3><p>" );
1872 doc += QLatin1String(
"</p>" );
1873 if ( causes.count() ) {
1874 doc += QLatin1String(
"<h3>" );
1875 doc +=
i18n(
"Possible Causes:" );
1876 doc += QLatin1String(
"</h3><ul><li>" );
1877 doc += causes.join(
"</li><li>" );
1878 doc += QLatin1String(
"</li></ul>" );
1880 if ( solutions.count() ) {
1881 doc += QLatin1String(
"<h3>" );
1882 doc +=
i18n(
"Possible Solutions:" );
1883 doc += QLatin1String(
"</h3><ul><li>" );
1884 doc += solutions.join(
"</li><li>" );
1885 doc += QLatin1String(
"</li></ul>" );
1888 html.replace( QLatin1String(
"TEXT"), doc );
1919 if (job->error() == KIO::ERR_IS_DIRECTORY)
1921 emit
canceled( job->errorString() );
1926 emit
canceled( job->errorString() );
1935 if (tjob && tjob->isErrorPage()) {
1936 HTMLPartContainerElementImpl *elt = d->
m_frame ?
1937 d->
m_frame->m_partContainerElement.data() : 0;
1942 elt->partLoadingErrorNotify();
1951 if ( d->
m_doc && d->
m_doc->docLoader()->expireDate() &&
url().
protocol().toLower().startsWith(
"http"))
1952 KIO::http_update_cache(
url(),
false, d->
m_doc->docLoader()->expireDate());
1963 if (mimeStr ==
"application/xhtml+xml")
1965 if (mimeStr ==
"image/svg+xml")
1967 if (mimeStr ==
"text/html" || mimeStr.isEmpty())
1970 KMimeType::Ptr mime = KMimeType::mimeType(mimeStr, KMimeType::ResolveAliases);
1971 if ((mime && mime->is(
"text/xml")) || mimeStr.endsWith(
"+xml"))
1974 if (mime && mime->is(
"text/plain"))
1977 if (khtmlImLoad::ImageManager::loaderDatabase()->supportedMimeTypes().contains(mimeStr))
1993 if ( d->
m_view->underMouse() )
1994 QToolTip::hideText();
1998 removeJSErrorExtension();
2003 KJS::Window *w = KJS::Window::retrieveWindow( part );
2005 w->forgetSuppressedWindows();
2021 if ( urlString != urlString2 ) {
2047 d->
m_doc = DOMImplementationImpl::createSVGDocument( d->
m_view );
2051 d->
m_doc = DOMImplementationImpl::createXMLDocument( d->
m_view );
2059 d->
m_doc = DOMImplementationImpl::createHTMLDocument( d->
m_view );
2061 static_cast<HTMLDocumentImpl *
>(d->
m_doc)->setHTMLRequested( type !=
MimeXHTML );
2067 if (!d->
m_doc->attached())
2068 d->
m_doc->attach( );
2078 if ( !userStyleSheet.isEmpty() )
2082 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2086 d->
m_doc->setParsing(
true);
2095 len = strlen( data );
2102 if(decoded.isEmpty())
2108 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2110 t->write( decoded,
true );
2127 d->
m_doc->setParseMode( DocumentImpl::Strict );
2133 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2135 t->write( str,
true );
2146 if (!decoded.isEmpty())
2149 d->
m_doc->finishParsing();
2153 void KHTMLPart::onFirstData()
2158 d->
m_doc->determineParseMode();
2164 d->
m_doc->setVisuallyOrdered();
2167 d->
m_doc->recalcStyle( NodeImpl::Force );
2172 KMimeType::Ptr mime = KMimeType::mimeType(mimeType, KMimeType::ResolveAliases);
2173 if ( mime && ( mime->is(
"text/html" ) || mime->is(
"text/xml" ) ) )
2183 write( data.data(), data.size() );
2197 d->
m_view->paint(p, rc, yOff, more);
2207 for (; it !=
end; ++it ) {
2208 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
2213 void KHTMLPart::resetFromScript()
2218 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2219 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2220 d->
m_doc->setParsing(
true);
2225 void KHTMLPart::slotFinishedParsing()
2227 d->
m_doc->setParsing(
false);
2228 d->
m_doc->dispatchHTMLEvent(EventImpl::KHTML_CONTENTLOADED_EVENT,
true,
false);
2229 checkEmitLoadEvent();
2230 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2238 void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
2240 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2265 void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
2267 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2287 void KHTMLPart::slotProgressUpdate()
2308 void KHTMLPart::slotJobSpeed(
KJob* ,
unsigned long speed )
2315 void KHTMLPart::slotJobPercent(
KJob* ,
unsigned long percent )
2325 void KHTMLPart::slotJobDone(
KJob* )
2335 void KHTMLPart::slotUserSheetStatDone(
KJob *_job )
2337 using namespace KIO;
2339 if ( _job->error() ) {
2361 *pendingRedirections =
false;
2366 for (; it !=
end; ++it ) {
2367 if ( !(*it)->m_bCompleted || (*it)->m_run )
2373 if ( (*it)->m_bPendingRedirection )
2374 *pendingRedirections =
true;
2382 for (; oi != oiEnd; ++oi )
2383 if ( !(*oi)->m_bCompleted )
2388 if ( m_doc && m_doc->parsing() )
2393 if ( m_doc && m_doc->docLoader() )
2394 requests = khtml::Cache::loader()->numRequests( m_doc->docLoader() );
2405 void KHTMLPart::checkCompleted()
2420 bool fullyLoaded, pendingChildRedirections;
2444 checkEmitLoadEvent();
2446 bool pendingAction =
false;
2460 pendingAction =
true;
2462 else if ( pendingChildRedirections )
2464 pendingAction =
true;
2471 d->
m_view->complete( pendingAction );
2476 sheets = d->
m_doc->availableStyleSheets();
2477 sheets.prepend(
i18n(
"Automatic Detection" ) );
2481 if (sheets.count() > 2)
2484 slotUseStylesheet();
2495 void KHTMLPart::checkEmitLoadEvent()
2497 bool fullyLoaded, pendingChildRedirections;
2513 #ifndef KDE_NO_COMPAT // KDE5: remove this ifndef, keep the method (renamed to baseUrl)
2518 return d->
m_doc->baseURL();
2531 return KUrl( d->
m_doc->completeURL( url ) );
2536 return KUrl::fromPercentEncoding( u.right( u.length() - 11 ).toUtf8() );
2541 QString script = codeForJavaScriptURL(u);
2542 kDebug( 6050 ) <<
"script=" << script;
2545 q->begin( q->url() );
2546 q->setAlwaysHonourDoctype();
2547 q->write( res.toString() );
2550 emit q->completed();
2555 return url.indexOf( QLatin1String(
"javascript:" ), 0, Qt::CaseInsensitive ) == 0;
2562 kDebug(6050) <<
"delay=" << delay <<
" url=" << url <<
" from=" << this->
url() <<
"parent=" <<
parentPart();
2573 if( delay < 24*60*60 &&
2590 m_delayRedirect = 0;
2591 m_redirectURL.clear();
2592 m_redirectionTimer.stop();
2595 void KHTMLPart::slotRedirect()
2615 if (!KAuthorized::authorizeUrlAction(
"redirect", cUrl, url))
2617 kWarning(6050) <<
"KHTMLPart::scheduleRedirection: Redirection from " << cUrl <<
" to " << url <<
" REJECTED!";
2622 if ( url.
equals(this->url(),
2640 if ( !
urlSelected( u, 0, 0,
"_self", args, browserArgs ) ) {
2646 void KHTMLPart::slotRedirection(
KIO::Job*,
const KUrl& url)
2659 if( !
url().isEmpty() ) {
2680 return defaultEncoding();
2683 QString KHTMLPart::defaultEncoding()
const
2686 if ( !encoding.isEmpty() )
2691 return "iso-8859-1";
2693 return KGlobal::locale()->encoding();
2699 (
void)
new khtml::PartStyleSheetLoader(
this, url.
url(), d->
m_doc->docLoader());
2705 d->
m_doc->setUserStyleSheet( styleSheet );
2713 HTMLCollectionImpl *anchors =
2714 new HTMLCollectionImpl( d->
m_doc, HTMLCollectionImpl::DOC_ANCHORS);
2716 NodeImpl *n = anchors->namedItem(name);
2720 n = d->
m_doc->getElementById( name );
2723 d->
m_doc->setCSSTarget(n);
2726 bool quirkyName = !n && !d->
m_doc->inStrictMode() && (name.isEmpty() || name.toLower() ==
"top");
2732 kDebug(6050) << name <<
"not found";
2738 HTMLElementImpl *a =
static_cast<HTMLElementImpl *
>(n);
2740 a->getUpperLeftCorner(x, y);
2741 if (x <= d->m_view->contentsX())
2744 gox = d->
m_view->contentsX();
2745 if ( x + 10 > d->
m_view->contentsX()+d->
m_view->visibleWidth()) {
2746 a->getLowerRightCorner(x, dummy);
2747 gox = x - d->
m_view->visibleWidth() + 10;
2751 d->
m_view->setContentsPos(gox, y);
2760 d->
m_view->focusNextPrevNode (
true );
2769 d->
m_view->focusNextPrevNode (
false );
2818 this->*flag = value;
2824 for (; it != itEnd; ++it) {
2834 for (; it != itEnd; ++it) {
2842 void KHTMLPart::initCaret()
2848 if (d->
m_doc->isHTMLDocument()) {
2849 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
2850 node = htmlDoc->body();
2864 if (!khtml::KHTMLPartAccessor::caret(part).caretPos().node()->isContentEditable())
2918 Q_UNUSED(extendSelection);
2919 #ifndef KHTML_NO_CARET
2921 kDebug(6200) <<
"node: " << node.
handle() <<
" nodeName: "
2923 <<
" extendSelection " << extendSelection;
2924 if (
view()->moveCaretTo(node.
handle(), offset, !extendSelection))
2925 emitSelectionChanged();
2926 view()->ensureCaretVisible();
2928 #endif // KHTML_NO_CARET
2934 #ifndef KHTML_NO_CARET
2936 #else // KHTML_NO_CARET
2938 #endif // KHTML_NO_CARET
2947 #ifndef KHTML_NO_CARET
2948 view()->setCaretDisplayPolicyNonFocused(policy);
2949 #endif // KHTML_NO_CARET
2957 if (
isCaretMode() || (caretNode && caretNode->isContentEditable())) {
2958 invalidateSelection();
2959 enableFindAheadActions(
false);
2965 clearCaretRectIfNeeded();
2975 bool KHTMLPart::initFindNode(
bool selection,
bool reverse,
bool fromCursor )
2980 void KHTMLPart::slotFind()
2985 if (!part->inherits(
"KHTMLPart") )
2987 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
2993 void KHTMLPart::slotFindNext()
2998 if (!part->inherits(
"KHTMLPart") )
3000 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
3006 void KHTMLPart::slotFindPrev()
3011 if (!part->inherits(
"KHTMLPart") )
3013 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
3019 void KHTMLPart::slotFindDone()
3024 void KHTMLPart::slotFindAheadText()
3034 void KHTMLPart::slotFindAheadLink()
3044 void KHTMLPart::enableFindAheadActions(
bool )
3049 void KHTMLPart::slotFindDialogDestroyed()
3076 bool KHTMLPart::pFindTextNextInThisFrame(
bool reverse )
3085 kDebug() <<
"Selection is not valid. Returning empty selection";
3088 if(sel.start().offset() < 0 || sel.end().offset() < 0) {
3089 kDebug() <<
"invalid values for end/startOffset " << sel.start().offset() <<
" " << sel.end().offset();
3095 int exceptioncode = 0;
3096 return r.
handle()->toHTML(exceptioncode).string();
3101 bool hasNewLine =
true;
3102 bool seenTDTag =
false;
3108 DOM::DOMStringImpl *dstr =
static_cast<DOM::TextImpl*
>(n.
handle())->renderString();
3109 QString str(dstr->s, dstr->l);
3110 if(!str.isEmpty()) {
3116 if(n == sel.start().node() && n == sel.end().node()) {
3117 int s = khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset();
3118 int e = khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset();
3119 text = str.mid(s, e-s);
3120 }
else if(n == sel.start().node()) {
3121 text = str.mid(khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset());
3122 }
else if(n == sel.end().node()) {
3123 text += str.left(khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset());
3133 text +=
static_cast<HTMLTextAreaElementImpl*
>(n.
handle())->value().string();
3136 if (static_cast<HTMLInputElementImpl*>(n.
handle())->inputType() != HTMLInputElementImpl::PASSWORD)
3137 text += static_cast<HTMLInputElementImpl*>(n.
handle())->value().string();
3140 text +=
static_cast<HTMLSelectElementImpl*
>(n.
handle())->value().string();
3147 text +=
static_cast<HTMLImageElementImpl*
>(n.
handle())->altText().string();
3181 if(n == sel.end().node())
break;
3232 int end = text.length();
3235 while ((start < end) && (text[start] ==
'\n'))
3239 while ((start < (end-1)) && (text[end-1] ==
'\n') && (text[end-2] ==
'\n'))
3242 return text.mid(start, end-start);
3245 QString KHTMLPart::simplifiedSelectedText()
const
3248 text.replace(QChar(0xa0),
' ');
3250 while (!text.isEmpty() && text[0].isSpace())
3252 while (!text.isEmpty() && text[text.length()-1].isSpace())
3253 text.truncate(text.length()-1);
3281 const Selection &KHTMLPart::caret()
const
3286 const Selection &KHTMLPart::dragCaret()
const
3291 void KHTMLPart::setCaret(
const Selection &s,
bool closeTyping)
3294 clearCaretRectIfNeeded();
3295 setFocusNodeIfNeeded(s);
3297 notifySelectionChanged(closeTyping);
3301 void KHTMLPart::setDragCaret(
const DOM::Selection &dragCaret)
3310 void KHTMLPart::clearSelection()
3312 clearCaretRectIfNeeded();
3314 #ifdef APPLE_CHANGES
3319 notifySelectionChanged();
3322 void KHTMLPart::invalidateSelection()
3324 clearCaretRectIfNeeded();
3326 selectionLayoutChanged();
3329 void KHTMLPart::setSelectionVisible(
bool flag)
3334 clearCaretRectIfNeeded();
3341 void KHTMLPart::slotClearSelection()
3346 clearCaretRectIfNeeded();
3348 #ifdef APPLE_CHANGES
3354 notifySelectionChanged();
3358 void KHTMLPart::clearCaretRectIfNeeded()
3366 void KHTMLPart::setFocusNodeIfNeeded(
const Selection &s)
3368 if (!xmlDocImpl() || s.state() == Selection::NONE)
3371 NodeImpl *n = s.start().node();
3372 NodeImpl *target = (n && n->isContentEditable()) ? n : 0;
3374 while (n && n != s.end().node()) {
3375 if (n->isContentEditable()) {
3379 n = n->traverseNextNode();
3382 assert(target == 0 || target->isContentEditable());
3385 for ( ; target && !target->isFocusable(); target = target->parentNode())
3387 if (target && target->isMouseFocusable())
3388 xmlDocImpl()->setFocusNode(target);
3389 else if (!target || !target->focused())
3390 xmlDocImpl()->setFocusNode(0);
3394 void KHTMLPart::selectionLayoutChanged()
3413 d->
m_view->ensureVisible(r.x(), r.y());
3417 d->
m_doc->updateSelection();
3424 void KHTMLPart::notifySelectionChanged(
bool closeTyping)
3427 selectionLayoutChanged();
3435 emitSelectionChanged();
3470 int dots = name.count(
'.');
3471 if (dots > 2 || (dots == 2 && !name.startsWith(
"www.")))
3490 void KHTMLPart::paintCaret(QPainter *p,
const QRect &rect)
const
3496 void KHTMLPart::paintDragCaret(QPainter *p,
const QRect &rect)
const
3507 void KHTMLPart::resetHoverText()
3515 setStatusBarText(
QString(), BarHoverText);
3520 void KHTMLPart::overURL(
const QString &url,
const QString &target,
bool )
3525 if ( url.isEmpty() )
3530 if ( url.isEmpty() ) {
3531 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3537 jscode = KStringHandler::rsqueeze( jscode, 80 );
3538 if (url.startsWith(
"javascript:window.open"))
3539 jscode +=
i18n(
" (In new window)");
3540 setStatusBarText( Qt::escape( jscode ), BarHoverText );
3552 com = typ->comment( u );
3554 if ( !u.isValid() ) {
3555 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3565 KDE_struct_stat buff;
3566 bool ok = !KDE::stat( path, &buff );
3568 KDE_struct_stat lbuff;
3569 if (ok) ok = !KDE::lstat( path, &lbuff );
3574 if (ok && S_ISLNK( lbuff.st_mode ) )
3578 tmp =
i18n(
"Symbolic Link");
3580 tmp =
i18n(
"%1 (Link)", com);
3581 char buff_two[1024];
3583 int n = readlink ( path.toLocal8Bit().data(), buff_two, 1022);
3588 setStatusBarText(text2, BarHoverText);
3597 else if ( ok && S_ISREG( buff.st_mode ) )
3599 if (buff.st_size < 1024)
3600 text =
i18np(
"%2 (%1 byte)",
"%2 (%1 bytes)", (
long) buff.st_size, text2);
3603 float d = (float) buff.st_size/1024.0;
3604 text =
i18n(
"%2 (%1 K)", KGlobal::locale()->formatNumber(d, 2), text2);
3609 else if ( ok && S_ISDIR( buff.st_mode ) )
3619 setStatusBarText(text, BarHoverText);
3624 if (target.toLower() ==
"_blank")
3626 extra =
i18n(
" (In new window)");
3628 else if (!target.isEmpty() &&
3629 (target.toLower() !=
"_top") &&
3630 (target.toLower() !=
"_self") &&
3631 (target.toLower() !=
"_parent"))
3637 extra =
i18n(
" (In new window)");
3639 extra =
i18n(
" (In other frame)");
3642 if (u.
protocol() == QLatin1String(
"mailto")) {
3644 mailtoMsg +=
i18n(
"Email to: ") + KUrl::fromPercentEncoding(u.
path().toLatin1());
3646 QStringList::ConstIterator it = queries.begin();
3647 const QStringList::ConstIterator itEnd = queries.end();
3648 for (; it != itEnd; ++it)
3649 if ((*it).startsWith(QLatin1String(
"subject=")))
3650 mailtoMsg +=
i18n(
" - Subject: ") + KUrl::fromPercentEncoding((*it).mid(8).toLatin1());
3651 else if ((*it).startsWith(QLatin1String(
"cc=")))
3652 mailtoMsg +=
i18n(
" - CC: ") + KUrl::fromPercentEncoding((*it).mid(3).toLatin1());
3653 else if ((*it).startsWith(QLatin1String(
"bcc=")))
3654 mailtoMsg +=
i18n(
" - BCC: ") + KUrl::fromPercentEncoding((*it).mid(4).toLatin1());
3655 mailtoMsg = Qt::escape(mailtoMsg);
3656 mailtoMsg.replace(QRegExp(
"([\n\r\t]|[ ]{10})"),
QString());
3657 setStatusBarText(
"<qt>"+mailtoMsg, BarHoverText);
3662 else if (u.
protocol() == QLatin1String(
"http")) {
3667 if (!hrefNode.
isNull()) {
3669 if (!hreflangNode.
isNull()) {
3672 if (countryCode == QLatin1String(
"en"))
3673 countryCode = QLatin1String(
"gb");
3674 QString flagImg = QLatin1String(
"<img src=%1>").arg(
3675 locate(
"locale", QLatin1String(
"l10n/")
3677 + QLatin1String(
"/flag.png")));
3678 emit setStatusBarText(flagImg + u.
prettyUrl() + extra);
3683 setStatusBarText(Qt::escape(u.
prettyUrl()) + extra, BarHoverText);
3695 bool hasTarget =
false;
3698 if ( target.isEmpty() && d->m_doc )
3699 target = d->m_doc->baseTarget();
3700 if ( !target.isEmpty() )
3703 if ( d->isJavaScriptURL(url) )
3705 crossFrameExecuteScript( target, d->codeForJavaScriptURL(url) );
3711 if ( url.isEmpty() )
3714 if ( !cURL.isValid() )
3718 kDebug(6050) <<
this <<
"complete URL:" << cURL.
url() <<
"target=" << target;
3720 if ( state & Qt::ControlModifier )
3722 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3726 if ( button == Qt::LeftButton && ( state & Qt::ShiftModifier ) )
3729 metaData.insert(
"referrer", d->m_referrer );
3734 if (!checkLinkSecurity(cURL,
3735 ki18n(
"<qt>This untrusted page links to<br /><b>%1</b>.<br />Do you want to follow the link?</qt>" ),
3741 args.
metaData().insert(
"main_frame_request",
3743 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
3744 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
3745 args.
metaData().insert(
"PropagateHttpHeader",
"true");
3746 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
3747 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
3749 if ( hasTarget && target !=
"_self" && target !=
"_top" && target !=
"_blank" && target !=
"_parent" )
3752 khtml::ChildFrame *frame = recursiveFrameRequest(
this, cURL, args, browserArgs,
false );
3755 args.
metaData()[
"referrer"] = d->m_referrer;
3756 requestObject( frame, cURL, args, browserArgs );
3761 if (!d->m_referrer.isEmpty() && !args.
metaData().contains(
"referrer"))
3762 args.
metaData()[
"referrer"] = d->m_referrer;
3764 if ( button == Qt::NoButton && (state & Qt::ShiftModifier) && (state & Qt::ControlModifier) )
3766 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3770 if ( state & Qt::ShiftModifier)
3774 emit d->m_extension->createNewWindow( cURL, args, browserArgs, winArgs );
3781 if (cURL.
hasRef() && (!hasTarget || target ==
"_self"))
3783 if (d->isLocalAnchorJump(cURL))
3785 d->executeAnchorJump(cURL, browserArgs.
lockHistory() );
3790 if ( !d->m_bComplete && !hasTarget )
3793 view()->viewport()->unsetCursor();
3794 emit d->m_extension->openUrlRequest( cURL, args, browserArgs );
3798 void KHTMLPart::slotViewDocumentSource()
3801 bool isTempFile =
false;
3805 sourceFile.
setSuffix(defaultExtension());
3806 sourceFile.setAutoRemove(
false);
3807 if (sourceFile.open())
3809 QDataStream stream ( &sourceFile );
3811 currentUrl =
KUrl();
3812 currentUrl.setPath(sourceFile.fileName());
3817 (void)
KRun::runUrl( currentUrl, QLatin1String(
"text/plain"),
view(), isTempFile );
3820 void KHTMLPart::slotViewPageInfo()
3825 dlg->setAttribute(Qt::WA_DeleteOnClose);
3826 dlg->setObjectName(
"KHTML Page Info Dialog");
3829 ui._close->setGuiItem(KStandardGuiItem::close());
3831 connect(ui._close, SIGNAL(clicked()), dlg, SLOT(accept()));
3833 ui._title->setText(d->m_doc->title().string());
3836 if (
parentPart() && d->m_doc && d->m_doc->isHTMLDocument() ) {
3837 dlg->setWindowTitle(
i18n(
"Frame Information"));
3842 if (!d->m_pageServices.isEmpty())
3843 editStr =
i18n(
" <a href=\"%1\">[Properties]</a>", d->m_pageServices);
3845 QString squeezedURL = KStringHandler::csqueeze(
url().prettyUrl(), 80 );
3846 ui._url->setText(
"<a href=\"" +
url().
url() +
"\">" + squeezedURL +
"</a>" + editStr);
3849 ui._lastModified->hide();
3850 ui._lmLabel->hide();
3856 if (enc.isEmpty()) {
3858 ui._encoding->hide();
3860 ui._encoding->setText(enc);
3863 if (!xmlDocImpl() || xmlDocImpl()->parseMode() == DOM::DocumentImpl::Unknown) {
3865 ui._modeLabel->hide();
3867 switch (xmlDocImpl()->parseMode()) {
3868 case DOM::DocumentImpl::Compat:
3869 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Quirks"));
3871 case DOM::DocumentImpl::Transitional:
3872 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Almost standards"));
3874 case DOM::DocumentImpl::Strict:
3876 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Strict"));
3882 const QStringList headers = d->m_httpHeaders.split(
"\n");
3884 QStringList::ConstIterator it = headers.begin();
3885 const QStringList::ConstIterator itEnd = headers.end();
3887 for (; it != itEnd; ++it) {
3889 if (header.count() != 2)
3891 QTreeWidgetItem *item =
new QTreeWidgetItem(ui._headers);
3892 item->setText(0, header[0]);
3893 item->setText(1, header[1]);
3901 void KHTMLPart::slotViewFrameSource()
3908 bool isTempFile =
false;
3909 if (!(url.
isLocalFile()) && frame->inherits(
"KHTMLPart"))
3911 long cacheId =
static_cast<KHTMLPart *
>(frame)->d->m_cacheId;
3916 sourceFile.
setSuffix(defaultExtension());
3917 sourceFile.setAutoRemove(
false);
3918 if (sourceFile.open())
3920 QDataStream stream ( &sourceFile );
3923 url.
setPath(sourceFile.fileName());
3929 (void)
KRun::runUrl( url, QLatin1String(
"text/plain"),
view(), isTempFile );
3935 if (!d->m_doc || !d->m_doc->isHTMLDocument())
3938 QString relURL =
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
3943 void KHTMLPart::slotSaveBackground()
3946 metaData[
"referrer"] = d->m_referrer;
3950 void KHTMLPart::slotSaveDocument()
3955 srcURL.setFileName(
"index" + defaultExtension() );
3962 void KHTMLPart::slotSecurity()
3986 const QStringList sl = d->m_ssl_peer_chain.split(
'\n', QString::SkipEmptyParts);
3988 bool certChainOk = d->m_ssl_in_use;
3990 foreach (
const QString &s, sl) {
3991 certChain.append(QSslCertificate(s.toLatin1()));
3992 if (certChain.last().isNull()) {
3993 certChainOk =
false;
3999 kid->setup(certChain,
4003 d->m_ssl_cipher_desc,
4004 d->m_ssl_cipher_version,
4005 d->m_ssl_cipher_used_bits.toInt(),
4006 d->m_ssl_cipher_bits.toInt(),
4015 QStringList sl = d->m_ssl_peer_chain.split(
'\x01', QString::SkipEmptyParts);
4017 bool decodedOk =
true;
4018 foreach (
const QString &s, sl) {
4019 certChain.append(QSslCertificate(s.toLatin1()));
4020 if (certChain.last().isNull()) {
4026 if (decodedOk ||
true ) {
4030 d->m_ssl_protocol_version,
4032 d->m_ssl_cipher_used_bits.toInt(),
4033 d->m_ssl_cipher_bits.toInt(),
4035 kDebug(7024) <<
"Showing SSL Info dialog";
4037 kDebug(7024) <<
"SSL Info dialog closed";
4040 "appears to be corrupt."),
4045 void KHTMLPart::slotSaveFrame()
4054 srcURL.
setFileName(
"index" + defaultExtension() );
4061 void KHTMLPart::slotSetEncoding(
const QString &enc)
4069 d->m_autoDetectLanguage=scri;
4073 void KHTMLPart::slotUseStylesheet()
4077 bool autoselect = (d->m_paUseStylesheet->currentItem() == 0);
4078 d->m_sheetUsed = autoselect ?
QString() : d->m_paUseStylesheet->currentText();
4079 d->m_doc->updateStyleSelector();
4083 void KHTMLPart::updateActions()
4085 bool frames =
false;
4089 for (; it !=
end; ++it )
4096 if (d->m_paViewFrame)
4097 d->m_paViewFrame->setEnabled( frames );
4098 if (d->m_paSaveFrame)
4099 d->m_paSaveFrame->setEnabled( frames );
4102 d->m_paFind->setText(
i18n(
"&Find in Frame..." ) );
4104 d->m_paFind->setText(
i18n(
"&Find..." ) );
4111 bool enableFindAndSelectAll =
true;
4114 enableFindAndSelectAll = frame->inherits(
"KHTMLPart" );
4116 d->m_paFind->setEnabled( enableFindAndSelectAll );
4117 d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
4119 bool enablePrintFrame =
false;
4125 enablePrintFrame = ext->metaObject()->indexOfSlot(
"print()" ) != -1;
4128 d->m_paPrintFrame->setEnabled( enablePrintFrame );
4133 if ( d->m_doc && d->m_doc->isHTMLDocument() &&
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body() && !d->m_bClearing )
4134 bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4136 if (d->m_paSaveBackground)
4137 d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
4139 if ( d->m_paDebugScript )
4140 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
4146 if ((*it)->m_partContainerElement.data() == frame)
4147 return (*it)->m_scriptable.data();
4151 void KHTMLPart::loadFrameElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4157 FrameIt it = d->m_frames.find( frameName );
4158 if ( it == d->m_frames.end() ) {
4161 child->
m_name = frameName;
4162 d->m_frames.insert( d->m_frames.end(), child );
4174 QString khtml = QString::fromLatin1(
"khtml");
4176 QString::fromLatin1(
"text/html"),
4183 navigateLocalProtocol(child, part,
KUrl(
"about:blank"));
4184 connectToChildPart(child, part,
"text/html" );
4194 if (!requestObject( child, u ) && !child->
m_run) {
4199 QString KHTMLPart::requestFrameName()
4201 return QString::fromLatin1(
"<!--frame %1-->").arg(d->m_frameNameId++);
4204 bool KHTMLPart::loadObjectElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4209 FrameIt it = d->m_objects.insert( d->m_objects.end(), child );
4212 (*it)->m_params = params;
4216 if (!requestObject( *it,
completeURL( url ), args ) && !(*it)->m_run) {
4217 (*it)->m_bCompleted =
true;
4228 if (!d->isJavaScriptURL(url.
url()) && !checkLinkSecurity(url))
4230 kDebug(6031) <<
this <<
"checkLinkSecurity refused";
4252 if ( child->
m_run ) {
4253 kDebug(6031) <<
"navigating ChildFrame while mimetype resolution was in progress...";
4254 child->
m_run.data()->abort();
4270 if (!d->m_referrer.isEmpty() && !child->
m_args.
metaData().contains(
"referrer" ))
4274 child->
m_args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4275 child->
m_args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4279 d->m_ssl_in_use ?
"TRUE":
"FALSE");
4280 child->
m_args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4286 if ((url.isEmpty() || url.
url() ==
"about:blank" || url.
protocol() ==
"javascript") && args.
mimeType().isEmpty())
4290 kDebug(6031) <<
"Running new KHTMLRun for" <<
this <<
"and child=" << child;
4292 d->m_bComplete =
false;
4295 return processObjectRequest( child, url, args.
mimeType() );
4310 kDebug( 6031 ) <<
"trying to create part for" << mimetype << _url;
4320 if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) ) {
4321 childLoadFailure(child);
4333 emit d->m_extension->openUrlNotify();
4347 (child->
m_run && child->
m_run.data()->serverSuggestsSave())) {
4366 int disposition = 0;
4368 suggestedFileName =
run->suggestedFileName();
4369 disposition =
run->serverSuggestsSave() ?
4375 dlg.setSuggestedFileName( suggestedFileName );
4400 if (mime->is(
"text/html")
4401 || mime->is(
"application/xml")) {
4410 childLoadFailure(child);
4414 connectToChildPart( child, part, mimetype );
4418 checkEmitLoadEvent();
4451 return navigateChild( child, url );
4457 if (!qobject_cast<KHTMLPart*>(inPart))
4465 d->propagateInitialDomainAndBaseTo(p);
4468 if (d->isJavaScriptURL(url.
url())) {
4471 d->codeForJavaScriptURL(url.
url()));
4476 d->propagateInitialDomainAndBaseTo(p);
4477 p->
write( res.toString() );
4483 p->
write(
"<HTML><TITLE></TITLE><BODY></BODY></HTML>");
4493 if (url.
protocol() ==
"javascript" || url.
url() ==
"about:blank") {
4494 return navigateLocalProtocol(child, child->
m_part.data(),
url);
4495 }
else if ( !url.isEmpty() ) {
4496 kDebug( 6031 ) <<
"opening" << url <<
"in frame" << child->
m_part;
4497 bool b = child->
m_part.data()->openUrl( url );
4512 kDebug(6031) <<
"we:" <<
this <<
"kid:" << child << part << mimetype;
4514 part->setObjectName( child->
m_name );
4518 if (!qobject_cast<KHTMLPart*>(p) && child->
m_jscript)
4536 if (qobject_cast<KHTMLPart*>(part)) {
4537 static_cast<KHTMLPart*
>(part)->d->m_frame = child;
4549 scriptExt->
setHost(d->m_scriptableExtension);
4554 sb->
setStatusBar( d->m_statusBarExtension->statusBar() );
4557 this, SLOT(slotChildStarted(
KIO::Job*)) );
4559 this, SLOT(slotChildCompleted()) );
4561 this, SLOT(slotChildCompleted(
bool)) );
4562 connect( part, SIGNAL(setStatusBarText(
QString)),
4563 this, SIGNAL(setStatusBarText(
QString)) );
4564 if ( part->inherits(
"KHTMLPart" ) )
4567 part, SLOT(slotParentCompleted()) );
4569 part, SLOT(slotParentCompleted()) );
4573 this, SLOT(slotChildDocCreated()) );
4580 connect( kidBrowserExt, SIGNAL(openUrlNotify()),
4581 d->m_extension, SIGNAL(openUrlNotify()) );
4594 connect( kidBrowserExt, SIGNAL(infoMessage(
QString)),
4595 d->m_extension, SIGNAL(infoMessage(
QString)) );
4600 kidBrowserExt->setBrowserInterface( d->m_extension->browserInterface() );
4610 if ( !serviceName.isEmpty() )
4611 constr.append( QString::fromLatin1(
"DesktopEntryName == '%1'" ).arg( serviceName ) );
4615 if ( offers.isEmpty() ) {
4616 int pos = mimetype.indexOf(
"-plugin" );
4619 QString stripped_mime = mimetype.left( pos );
4621 if ( offers.isEmpty() )
4625 KService::List::ConstIterator it = offers.constBegin();
4626 const KService::List::ConstIterator itEnd = offers.constEnd();
4627 for ( ; it != itEnd; ++it )
4635 QVariantList variantlist;
4636 Q_FOREACH(
const QString& str, params)
4639 if ( service->
serviceTypes().contains(
"Browser/View" ) )
4640 variantlist <<
QString(
"Browser/View");
4645 serviceName = service->name();
4650 kWarning() <<
QString(
"There was an error loading the module %1.\nThe diagnostics is:\n%2")
4659 if ( !d->m_manager && d->m_view )
4662 d->m_manager->setObjectName(
"khtml part manager" );
4664 connect( d->m_manager, SIGNAL(activePartChanged(
KParts::Part*)),
4666 connect( d->m_manager, SIGNAL(partRemoved(
KParts::Part*)),
4670 return d->m_manager;
4673 void KHTMLPart::submitFormAgain()
4675 disconnect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4676 if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
4677 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 );
4679 delete d->m_submitForm;
4680 d->m_submitForm = 0;
4685 submitForm(action, url, formData, _target, contentType, boundary);
4688 void KHTMLPart::submitForm(
const char *action,
const QString &url,
const QByteArray &formData,
const QString &_target,
const QString& contentType,
const QString& boundary )
4690 kDebug(6000) <<
this <<
"target=" << _target <<
"url=" <<
url;
4718 if (!d->m_submitForm) {
4720 if (d->m_ssl_in_use) {
4722 "\nA third party may be able to intercept and view this information."
4723 "\nAre you sure you wish to continue?"),
4729 if (kss.warnOnUnencrypted()) {
4731 i18n(
"Warning: Your data is about to be transmitted across the network unencrypted."
4732 "\nAre you sure you wish to continue?"),
4733 i18n(
"Network Transmission"),
4735 KStandardGuiItem::cancel(),
4736 "WarnOnUnencryptedForm");
4738 QString grpNotifMsgs = QLatin1String(
"Notification Messages");
4741 if (!cg.readEntry(
"WarnOnUnencryptedForm",
true)) {
4742 cg.deleteEntry(
"WarnOnUnencryptedForm");
4744 kss.setWarnOnUnencrypted(
false);
4755 i18n(
"This site is attempting to submit form data via email.\n"
4756 "Do you want to continue?"),
4757 i18n(
"Network Transmission"),
4759 KStandardGuiItem::cancel(),
4760 "WarnTriedEmailSubmit");
4773 if ( d->isJavaScriptURL(urlstring) ) {
4774 crossFrameExecuteScript( _target, d->codeForJavaScriptURL(urlstring) );
4778 if (!checkLinkSecurity(u,
4779 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>" ),
4785 d->clearRedirection();
4789 if (!d->m_referrer.isEmpty())
4790 args.
metaData()[
"referrer"] = d->m_referrer;
4792 args.
metaData().insert(
"PropagateHttpHeader",
"true");
4793 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4794 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4795 args.
metaData().insert(
"main_frame_request",
4797 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
4798 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4803 browserArgs.
frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
4810 bool triedToAttach =
false;
4812 QStringList::Iterator nvp = nvps.begin();
4813 const QStringList::Iterator nvpEnd = nvps.end();
4818 while (nvp != nvpEnd) {
4820 if (pair.count() >= 2) {
4821 if (pair.first().toLower() ==
"attach") {
4822 nvp = nvps.erase(nvp);
4823 triedToAttach =
true;
4833 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");
4837 if (contentType.toLower() ==
"multipart/form-data") {
4839 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4841 }
else if (contentType.toLower() ==
"text/plain") {
4843 QString tmpbody = QString::fromLatin1(formData.data(),
4845 tmpbody.replace(QRegExp(
"[&]"),
"\n");
4846 tmpbody.replace(QRegExp(
"[+]"),
" ");
4847 tmpbody = KUrl::fromPercentEncoding(tmpbody.toLatin1());
4848 bodyEnc = QLatin1String( KUrl::toPercentEncoding(tmpbody) );
4850 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4851 formData.size())) );
4854 nvps.append(
QString(
"body=%1").arg(bodyEnc));
4859 if (
strcmp( action,
"get" ) == 0 ) {
4861 u.
setQuery( QString::fromLatin1( formData.data(), formData.size() ) );
4869 if (contentType.isNull() || contentType ==
"application/x-www-form-urlencoded")
4870 browserArgs.
setContentType(
"Content-Type: application/x-www-form-urlencoded" );
4872 browserArgs.
setContentType(
"Content-Type: " + contentType +
"; boundary=" + boundary );
4875 if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
4876 if( d->m_submitForm ) {
4877 kDebug(6000) <<
"ABORTING!";
4882 d->m_submitForm->submitUrl =
url;
4883 d->m_submitForm->submitFormData = formData;
4884 d->m_submitForm->target = _target;
4885 d->m_submitForm->submitContentType = contentType;
4886 d->m_submitForm->submitBoundary = boundary;
4887 connect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4891 emit d->m_extension->openUrlRequest( u, args, browserArgs );
4904 if ( linkUrl.isEmpty() ) {
4910 popupURL = khtmlPart->
url();
4918 linkKUrl = popupURL;
4922 if (!(d->m_strSelectedURLTarget).isEmpty() &&
4923 (d->m_strSelectedURLTarget.toLower() !=
"_top") &&
4924 (d->m_strSelectedURLTarget.toLower() !=
"_self") &&
4925 (d->m_strSelectedURLTarget.toLower() !=
"_parent")) {
4926 if (d->m_strSelectedURLTarget.toLower() ==
"_blank")
4941 QPointer<QObject> guard( client );
4943 QString mimetype = QLatin1String(
"text/html" );
4946 if (!linkUrl.isEmpty())
4950 mimetype = KMimeType::findByUrl(popupURL,0,
true,
false)->name();
4955 if (!fname.isEmpty() && !popupURL.
hasRef() && popupURL.
query().isEmpty())
4963 if (pmt->name() != KMimeType::defaultMimeType() &&
4964 !pmt->is(
"application/x-perl") &&
4965 !pmt->is(
"application/x-perl-module") &&
4966 !pmt->is(
"application/x-php") &&
4967 !pmt->is(
"application/x-python-bytecode") &&
4968 !pmt->is(
"application/x-python") &&
4969 !pmt->is(
"application/x-shellscript"))
4970 mimetype = pmt->name();
4977 emit d->m_extension->popupMenu( QCursor::pos(), popupURL, S_IFREG ,
4978 args, browserArgs, itemflags,
4981 if ( !guard.isNull() ) {
4983 emit
popupMenu(linkUrl, QCursor::pos());
4984 d->m_strSelectedURL.clear();
4985 d->m_strSelectedURLTarget.clear();
4989 void KHTMLPart::slotParentCompleted()
4992 if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
4995 d->m_redirectionTimer.setSingleShot(
true );
4996 d->m_redirectionTimer.start( qMax(0, 1000 * d->m_delayRedirect) );
5000 void KHTMLPart::slotChildStarted(
KIO::Job *job )
5008 if ( d->m_bComplete )
5014 emit d->m_extension->openURLNotify();
5017 d->m_bComplete =
false;
5022 void KHTMLPart::slotChildCompleted()