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"))
638 DOM::HashChangeEventImpl *hashChangeEvImpl = 0;
641 if ((oldRef != newRef) || (oldRef.isNull() && newRef.isEmpty())) {
642 hashChangeEvImpl =
new DOM::HashChangeEventImpl();
643 hashChangeEvImpl->initHashChangeEvent(
"hashchange",
657 if (hashChangeEvImpl) {
658 m_doc->dispatchWindowEvent(hashChangeEvImpl);
664 kDebug( 6050 ) <<
this <<
"opening" <<
url;
665 #ifndef KHTML_NO_WALLET
692 if ( !urls.isEmpty() ) {
693 const KUrl mainURL = urls.first();
694 int error = mainURL.
queryItem(
"error" ).toInt();
696 if ( error == 0 ) error = KIO::ERR_UNKNOWN;
713 d->
m_statusBarUALabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum));
737 bool isFrameSet =
false;
738 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
739 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
740 isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
747 for (; it !=
end; ++it) {
762 if ( url.
hasRef() && !isFrameSet )
764 bool noReloadForced = !args.reload() && !browserArgs.redirectedRequest() && !browserArgs.doPost();
767 kDebug( 6050 ) <<
"jumping to anchor. m_url = " <<
url;
776 d->
m_doc->setParsing(
false);
778 kDebug( 6050 ) <<
"completed...";
787 args.setXOffset( d->
m_view->contentsX() );
788 args.setYOffset( d->
m_view->contentsY() );
796 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
797 connect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
808 begin(url, args.xOffset(), args.yOffset());
809 write(QString::fromLatin1(
"<html><head></head><body>"));
811 write(QString::fromLatin1(
"<img "));
813 write(QString::fromLatin1(
"<embed "));
814 write(QString::fromLatin1(
"src=\""));
819 write(QString::fromLatin1(
"\">"));
828 if(url.
protocol().startsWith(
"http" ) && !url.host().isEmpty() &&
829 url.
path().isEmpty()) {
836 metaData.insert(
"main_frame_request",
parentPart() == 0 ?
"TRUE" :
"FALSE" );
839 metaData.insert(
"PropagateHttpHeader",
"true");
840 metaData.insert(
"ssl_was_in_use", d->
m_ssl_in_use ?
"TRUE" :
"FALSE" );
841 metaData.insert(
"ssl_activate_warnings",
"TRUE" );
849 else if (args.reload() && !browserArgs.softReload)
854 if ( browserArgs.doPost() && (url.
protocol().startsWith(
"http")) )
856 d->
m_job = KIO::http_post( url, browserArgs.postData, KIO::HideProgressInfo );
857 d->
m_job->addMetaData(
"content-type", browserArgs.contentType() );
861 d->
m_job = KIO::get( url, KIO::NoReload, KIO::HideProgressInfo );
866 d->
m_job->ui()->setWindow(
widget()->topLevelWidget());
867 d->
m_job->addMetaData(metaData);
869 connect( d->
m_job, SIGNAL(result(
KJob*)),
872 SLOT(slotData(
KIO::Job*,QByteArray)) );
894 connect( d->
m_job, SIGNAL(speed(
KJob*,ulong)),
895 this, SLOT(slotJobSpeed(
KJob*,ulong)) );
897 connect( d->
m_job, SIGNAL(percent(
KJob*,ulong)),
898 this, SLOT(slotJobPercent(
KJob*,ulong)) );
900 connect( d->
m_job, SIGNAL(result(
KJob*)),
901 this, SLOT(slotJobDone(
KJob*)) );
909 KIO::StatJob *job = KIO::stat( url, KIO::HideProgressInfo );
910 connect( job, SIGNAL(result(
KJob*)),
911 this, SLOT(slotUserSheetStatDone(
KJob*)) );
928 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
929 HTMLDocumentImpl* hdoc =
static_cast<HTMLDocumentImpl*
>( d->
m_doc );
932 hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT,
false,
false );
934 d->
m_doc->updateRendering();
943 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
948 kDebug( 6050 ) <<
" was still parsing... calling end ";
949 slotFinishedParsing();
950 d->
m_doc->setParsing(
false);
956 kDebug( 6050 ) <<
"Aborted before starting to render, reverting location bar to " <<
url().
prettyUrl();
963 khtml::Cache::loader()->cancelRequests( d->
m_doc->docLoader() );
969 for (; it !=
end; ++it )
972 (*it)->m_run.data()->abort();
973 if ( !( *it )->m_part.isNull() )
974 ( *it )->m_part.data()->closeUrl();
981 for (; it !=
end; ++it)
983 if ( !( *it )->m_part.isNull() )
984 ( *it )->m_part.data()->closeUrl();
996 d->
m_view->closeChildDialogs();
1004 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
1006 return static_cast<HTMLDocumentImpl*
>(0);
1019 QByteArray sourceArray;
1020 QDataStream dataStream( &sourceArray, QIODevice::WriteOnly );
1022 QTextStream stream( sourceArray, QIODevice::ReadOnly );
1023 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1024 sourceStr = stream.readAll();
1031 if ( f.open( QIODevice::ReadOnly ) )
1033 QTextStream stream( &f );
1034 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1035 sourceStr = stream.readAll();
1063 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1070 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1083 if (!proxy || proxy->paused())
1086 return proxy->interpreter();
1097 d->
m_frame->m_jscript->clear();
1135 KJSProxy *KHTMLPart::jScript()
1147 for (; it !=
end; ++it)
1148 if ((*it)->m_part.data() ==
this) {
1167 QString trg = target.toLower();
1169 if (target ==
"_top") {
1173 else if (target ==
"_parent") {
1177 else if (target ==
"_self" || target ==
"_blank") {
1187 if (destpart ==
this)
1191 if (destpart->checkFrameAccess(
this))
1224 d->
m_jsedlg->_clear->setIcon(
KIcon(
"edit-clear-locationbar-ltr"));
1231 void KHTMLPart::removeJSErrorExtension() {
1245 void KHTMLPart::disableJSErrorExtension() {
1246 removeJSErrorExtension();
1255 void KHTMLPart::jsErrorDialogContextMenu() {
1257 m->addAction(
i18n(
"&Hide Errors"),
this, SLOT(removeJSErrorExtension()));
1258 m->addAction(
i18n(
"&Disable Error Reporting"),
this, SLOT(disableJSErrorExtension()));
1259 m->popup(QCursor::pos());
1262 void KHTMLPart::launchJSErrorDialog() {
1270 void KHTMLPart::launchJSConfigDialog() {
1272 args <<
"khtml_java_js";
1280 kDebug(6070) <<
"executeScript: caller='" << objectName() <<
"' filename=" << filename <<
" baseLine=" << baseLine ;
1284 if (!proxy || proxy->paused())
1288 (void)proxy->interpreter();
1290 KJS::Completion comp;
1292 QVariant ret = proxy->evaluate(filename, baseLine, script, n, &comp);
1297 if (comp.complType() == KJS::Throw && comp.value()) {
1300 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1301 proxy->interpreter()->globalExec(), comp.value());
1303 Qt::escape(filename), Qt::escape(msg)));
1310 kDebug(6070) <<
"executeScript done, handling immediate redirection NOW";
1312 khtml::Tokenizer* t = d->
m_doc->tokenizer();
1334 if (!proxy || proxy->paused())
1336 (void)proxy->interpreter();
1339 KJS::Completion comp;
1340 const QVariant ret = proxy->evaluate(
QString(), 1, script, n, &comp );
1346 if (comp.complType() == KJS::Throw && comp.value()) {
1349 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1350 proxy->interpreter()->globalExec(), comp.value());
1351 dlg->
addError(
i18n(
"<qt><b>Error</b>: node %1: %2</qt>",
1401 void KHTMLPart::slotDebugDOMTree()
1404 qDebug(
"%s", d->
m_doc->toString().string().toLatin1().constData());
1412 for (; it !=
end; ++it )
1413 if ( !( *it )->m_part.isNull() && (*it)->m_part.data()->inherits(
"KHTMLPart" ) ) {
1416 static_cast<KHTMLPart*
>( p )->slotDebugDOMTree();
1421 void KHTMLPart::slotDebugScript()
1424 jScript()->showDebugWindow();
1427 void KHTMLPart::slotDebugRenderTree()
1431 d->
m_doc->renderer()->printTree();
1442 void KHTMLPart::slotDebugFrameTree()
1447 void KHTMLPart::slotStopAnimations()
1454 if ( d->
m_doc && d->
m_doc->docLoader()->autoloadImages() == enable )
1458 d->
m_doc->docLoader()->setAutoloadImages( enable );
1470 connect( d->
m_paLoadImages, SIGNAL(triggered(
bool)),
this, SLOT(slotLoadImages()) );
1483 return d->
m_doc->docLoader()->autoloadImages();
1488 void KHTMLPart::clear()
1500 for(; it !=
end; ++it )
1504 (*it)->m_run.data()->abort();
1511 for(; it !=
end; ++it )
1515 (*it)->m_run.data()->abort();
1526 if (d->
m_doc->attached())
1532 d->
m_frame->m_jscript->clear();
1535 if (d->
m_doc && d->
m_doc->renderer() && d->
m_doc->renderer()->layer())
1536 d->
m_doc->renderer()->layer()->suspendMarquees();
1563 for(; it !=
end; ++it )
1565 if ( (*it)->m_part )
1568 delete (*it)->m_part.data();
1582 for (; oi != oiEnd; ++oi )
1584 delete (*oi)->m_part.data();
1606 #ifndef QT_NO_CLIPBOARD
1607 connect( qApp->clipboard(), SIGNAL(
selectionChanged()), SLOT(slotClearSelection()));
1635 DOM::HTMLDocumentImpl *KHTMLPart::docImpl()
const
1637 if ( d && d->
m_doc && d->
m_doc->isHTMLDocument() )
1638 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
1642 DOM::DocumentImpl *KHTMLPart::xmlDocImpl()
const
1649 void KHTMLPart::slotInfoMessage(
KJob* kio_job,
const QString& msg)
1656 setStatusBarText(msg, BarDefaultText);
1664 void KHTMLPart::slotData(
KIO::Job* kio_job,
const QByteArray &data )
1689 d->
m_doc->docLoader()->setCachePolicy(KIO::CC_Verify);
1699 time_t cacheCreationDate = d->
m_job->queryMetaData(
"cache-creation-date").toLong();
1700 d->
m_doc->docLoader()->setCacheCreationDate(cacheCreationDate);
1735 qData = d->
m_job->queryMetaData(
"http-refresh");
1736 if( !qData.isEmpty())
1737 d->
m_doc->processHttpEquiv(
"refresh", qData);
1748 QString language = d->
m_job->queryMetaData(
"content-language");
1749 if (!language.isEmpty())
1750 d->
m_doc->setContentLanguage(language);
1752 if ( !
url().isLocalFile() )
1762 write( data.data(), data.size() );
1765 void KHTMLPart::slotRestoreData(
const QByteArray &data )
1781 write( data.data(), data.size() );
1783 if (data.size() == 0)
1797 if (job->error() == KIO::ERR_NO_CONTENT)
1801 job->uiDelegate()->showErrorMessage();
1811 kDebug(6050) <<
"errorCode" << errorCode <<
"text" << text;
1819 QString errorName, techName, description;
1822 QByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
1823 QDataStream stream(raw);
1825 stream >> errorName >> techName >> description >> causes >> solutions;
1831 url = Qt::escape( Qt::escape( reqUrl.
prettyUrl() ) );
1833 datetime = KGlobal::locale()->formatDateTime( QDateTime::currentDateTime(),
1837 QFile file( filename );
1838 bool isOpened = file.open( QIODevice::ReadOnly );
1840 kWarning(6050) <<
"Could not open error html template:" << filename;
1844 html.replace( QLatin1String(
"TITLE" ),
i18n(
"Error: %1 - %2", errorName, url ) );
1845 html.replace( QLatin1String(
"DIRECTION" ), QApplication::isRightToLeft() ?
"rtl" :
"ltr" );
1848 QString doc = QLatin1String(
"<h1>" );
1849 doc +=
i18n(
"The requested operation could not be completed" );
1850 doc += QLatin1String(
"</h1><h2>" );
1852 doc += QLatin1String(
"</h2>" );
1853 if ( !techName.isNull() ) {
1854 doc += QLatin1String(
"<h2>" );
1855 doc +=
i18n(
"Technical Reason: " );
1857 doc += QLatin1String(
"</h2>" );
1859 doc += QLatin1String(
"<br clear=\"all\">" );
1860 doc += QLatin1String(
"<h3>" );
1861 doc +=
i18n(
"Details of the Request:" );
1862 doc += QLatin1String(
"</h3><ul><li>" );
1863 doc +=
i18n(
"URL: %1" , url );
1864 doc += QLatin1String(
"</li><li>" );
1865 if ( !protocol.isNull() ) {
1866 doc +=
i18n(
"Protocol: %1", protocol );
1867 doc += QLatin1String(
"</li><li>" );
1869 doc +=
i18n(
"Date and Time: %1" , datetime );
1870 doc += QLatin1String(
"</li><li>" );
1871 doc +=
i18n(
"Additional Information: %1" , text );
1872 doc += QLatin1String(
"</li></ul><h3>" );
1873 doc +=
i18n(
"Description:" );
1874 doc += QLatin1String(
"</h3><p>" );
1876 doc += QLatin1String(
"</p>" );
1877 if ( causes.count() ) {
1878 doc += QLatin1String(
"<h3>" );
1879 doc +=
i18n(
"Possible Causes:" );
1880 doc += QLatin1String(
"</h3><ul><li>" );
1881 doc += causes.join(
"</li><li>" );
1882 doc += QLatin1String(
"</li></ul>" );
1884 if ( solutions.count() ) {
1885 doc += QLatin1String(
"<h3>" );
1886 doc +=
i18n(
"Possible Solutions:" );
1887 doc += QLatin1String(
"</h3><ul><li>" );
1888 doc += solutions.join(
"</li><li>" );
1889 doc += QLatin1String(
"</li></ul>" );
1892 html.replace( QLatin1String(
"TEXT"), doc );
1923 if (job->error() == KIO::ERR_IS_DIRECTORY)
1925 emit
canceled( job->errorString() );
1930 emit
canceled( job->errorString() );
1939 if (tjob && tjob->isErrorPage()) {
1940 HTMLPartContainerElementImpl *elt = d->
m_frame ?
1941 d->
m_frame->m_partContainerElement.data() : 0;
1946 elt->partLoadingErrorNotify();
1956 KIO::http_update_cache(
url(),
false, d->
m_doc->docLoader()->expireDate());
1967 if (mimeStr ==
"application/xhtml+xml")
1969 if (mimeStr ==
"image/svg+xml")
1971 if (mimeStr ==
"text/html" || mimeStr.isEmpty())
1974 KMimeType::Ptr mime = KMimeType::mimeType(mimeStr, KMimeType::ResolveAliases);
1975 if ((mime && mime->is(
"text/xml")) || mimeStr.endsWith(
"+xml"))
1978 if (mime && mime->is(
"text/plain"))
1981 if (khtmlImLoad::ImageManager::loaderDatabase()->supportedMimeTypes().contains(mimeStr))
1997 if ( d->
m_view->underMouse() )
1998 QToolTip::hideText();
2002 removeJSErrorExtension();
2007 KJS::Window *w = KJS::Window::retrieveWindow( part );
2009 w->forgetSuppressedWindows();
2025 if ( urlString != urlString2 ) {
2049 d->
m_doc = DOMImplementationImpl::createSVGDocument( d->
m_view );
2053 d->
m_doc = DOMImplementationImpl::createXMLDocument( d->
m_view );
2061 d->
m_doc = DOMImplementationImpl::createHTMLDocument( d->
m_view );
2063 static_cast<HTMLDocumentImpl *
>(d->
m_doc)->setHTMLRequested( type !=
MimeXHTML );
2069 if (!d->
m_doc->attached())
2070 d->
m_doc->attach( );
2080 if ( !userStyleSheet.isEmpty() )
2084 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2088 d->
m_doc->setParsing(
true);
2097 len = strlen( data );
2104 if(decoded.isEmpty())
2110 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2112 t->write( decoded,
true );
2129 d->
m_doc->setParseMode( DocumentImpl::Strict );
2135 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2137 t->write( str,
true );
2148 if (!decoded.isEmpty())
2151 d->
m_doc->finishParsing();
2155 void KHTMLPart::onFirstData()
2160 d->
m_doc->determineParseMode();
2166 d->
m_doc->setVisuallyOrdered();
2169 d->
m_doc->recalcStyle( NodeImpl::Force );
2174 KMimeType::Ptr mime = KMimeType::mimeType(mimeType, KMimeType::ResolveAliases);
2175 if ( mime && ( mime->is(
"text/html" ) || mime->is(
"text/xml" ) ) )
2185 write( data.data(), data.size() );
2199 d->
m_view->paint(p, rc, yOff, more);
2209 for (; it !=
end; ++it ) {
2210 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
2215 void KHTMLPart::resetFromScript()
2220 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2221 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2222 d->
m_doc->setParsing(
true);
2227 void KHTMLPart::slotFinishedParsing()
2229 d->
m_doc->setParsing(
false);
2230 d->
m_doc->dispatchHTMLEvent(EventImpl::KHTML_CONTENTLOADED_EVENT,
true,
false);
2231 checkEmitLoadEvent();
2232 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2240 void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
2242 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2267 void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
2269 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2289 void KHTMLPart::slotProgressUpdate()
2310 void KHTMLPart::slotJobSpeed(
KJob* ,
unsigned long speed )
2317 void KHTMLPart::slotJobPercent(
KJob* ,
unsigned long percent )
2327 void KHTMLPart::slotJobDone(
KJob* )
2337 void KHTMLPart::slotUserSheetStatDone(
KJob *_job )
2339 using namespace KIO;
2341 if ( _job->error() ) {
2363 *pendingRedirections =
false;
2368 for (; it !=
end; ++it ) {
2369 if ( !(*it)->m_bCompleted || (*it)->m_run )
2375 if ( (*it)->m_bPendingRedirection )
2376 *pendingRedirections =
true;
2384 for (; oi != oiEnd; ++oi )
2385 if ( !(*oi)->m_bCompleted )
2390 if ( m_doc && m_doc->parsing() )
2395 if ( m_doc && m_doc->docLoader() )
2396 requests = khtml::Cache::loader()->numRequests( m_doc->docLoader() );
2407 void KHTMLPart::checkCompleted()
2422 bool fullyLoaded, pendingChildRedirections;
2446 checkEmitLoadEvent();
2448 bool pendingAction =
false;
2462 pendingAction =
true;
2464 else if ( pendingChildRedirections )
2466 pendingAction =
true;
2473 d->
m_view->complete( pendingAction );
2478 sheets = d->
m_doc->availableStyleSheets();
2479 sheets.prepend(
i18n(
"Automatic Detection" ) );
2483 if (sheets.count() > 2)
2486 slotUseStylesheet();
2497 void KHTMLPart::checkEmitLoadEvent()
2499 bool fullyLoaded, pendingChildRedirections;
2515 #ifndef KDE_NO_COMPAT // KDE5: remove this ifndef, keep the method (renamed to baseUrl)
2520 return d->
m_doc->baseURL();
2533 return KUrl( d->
m_doc->completeURL( url ) );
2538 return KUrl::fromPercentEncoding( u.right( u.length() - 11 ).toUtf8() );
2543 QString script = codeForJavaScriptURL(u);
2544 kDebug( 6050 ) <<
"script=" << script;
2547 q->begin( q->url() );
2548 q->setAlwaysHonourDoctype();
2549 q->write( res.toString() );
2552 emit q->completed();
2557 return url.indexOf( QLatin1String(
"javascript:" ), 0, Qt::CaseInsensitive ) == 0;
2564 kDebug(6050) <<
"delay=" << delay <<
" url=" << url <<
" from=" << this->
url() <<
"parent=" <<
parentPart();
2575 if( delay < 24*60*60 &&
2592 m_delayRedirect = 0;
2593 m_redirectURL.clear();
2594 m_redirectionTimer.stop();
2597 void KHTMLPart::slotRedirect()
2617 if (!KAuthorized::authorizeUrlAction(
"redirect", cUrl, url))
2619 kWarning(6050) <<
"KHTMLPart::scheduleRedirection: Redirection from " << cUrl <<
" to " << url <<
" REJECTED!";
2624 if ( url.
equals(this->url(),
2642 if ( !
urlSelected( u, 0, 0,
"_self", args, browserArgs ) ) {
2648 void KHTMLPart::slotRedirection(
KIO::Job*,
const KUrl& url)
2661 if( !
url().isEmpty() ) {
2682 return defaultEncoding();
2685 QString KHTMLPart::defaultEncoding()
const
2688 if ( !encoding.isEmpty() )
2693 return "iso-8859-1";
2695 return KGlobal::locale()->encoding();
2701 (
void)
new khtml::PartStyleSheetLoader(
this, url.
url(), d->
m_doc->docLoader());
2707 d->
m_doc->setUserStyleSheet( styleSheet );
2715 HTMLCollectionImpl *anchors =
2716 new HTMLCollectionImpl( d->
m_doc, HTMLCollectionImpl::DOC_ANCHORS);
2718 NodeImpl *n = anchors->namedItem(name);
2722 n = d->
m_doc->getElementById( name );
2725 d->
m_doc->setCSSTarget(n);
2728 bool quirkyName = !n && !d->
m_doc->inStrictMode() && (name.isEmpty() || name.toLower() ==
"top");
2734 kDebug(6050) << name <<
"not found";
2740 HTMLElementImpl *a =
static_cast<HTMLElementImpl *
>(n);
2742 a->getUpperLeftCorner(x, y);
2743 if (x <= d->m_view->contentsX())
2746 gox = d->
m_view->contentsX();
2747 if ( x + 10 > d->
m_view->contentsX()+d->
m_view->visibleWidth()) {
2748 a->getLowerRightCorner(x, dummy);
2749 gox = x - d->
m_view->visibleWidth() + 10;
2753 d->
m_view->setContentsPos(gox, y);
2762 d->
m_view->focusNextPrevNode (
true );
2771 d->
m_view->focusNextPrevNode (
false );
2820 this->*flag = value;
2826 for (; it != itEnd; ++it) {
2836 for (; it != itEnd; ++it) {
2844 void KHTMLPart::initCaret()
2850 if (d->
m_doc->isHTMLDocument()) {
2851 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
2852 node = htmlDoc->body();
2866 if (!khtml::KHTMLPartAccessor::caret(part).caretPos().node()->isContentEditable())
2920 Q_UNUSED(extendSelection);
2921 #ifndef KHTML_NO_CARET
2923 kDebug(6200) <<
"node: " << node.
handle() <<
" nodeName: "
2925 <<
" extendSelection " << extendSelection;
2926 if (
view()->moveCaretTo(node.
handle(), offset, !extendSelection))
2927 emitSelectionChanged();
2928 view()->ensureCaretVisible();
2930 #endif // KHTML_NO_CARET
2936 #ifndef KHTML_NO_CARET
2938 #else // KHTML_NO_CARET
2940 #endif // KHTML_NO_CARET
2949 #ifndef KHTML_NO_CARET
2950 view()->setCaretDisplayPolicyNonFocused(policy);
2951 #endif // KHTML_NO_CARET
2959 if (
isCaretMode() || (caretNode && caretNode->isContentEditable())) {
2960 invalidateSelection();
2961 enableFindAheadActions(
false);
2967 clearCaretRectIfNeeded();
2977 bool KHTMLPart::initFindNode(
bool selection,
bool reverse,
bool fromCursor )
2982 void KHTMLPart::slotFind()
2987 if (!part->inherits(
"KHTMLPart") )
2989 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
2995 void KHTMLPart::slotFindNext()
3000 if (!part->inherits(
"KHTMLPart") )
3002 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
3008 void KHTMLPart::slotFindPrev()
3013 if (!part->inherits(
"KHTMLPart") )
3015 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
3021 void KHTMLPart::slotFindDone()
3026 void KHTMLPart::slotFindAheadText()
3036 void KHTMLPart::slotFindAheadLink()
3046 void KHTMLPart::enableFindAheadActions(
bool )
3051 void KHTMLPart::slotFindDialogDestroyed()
3078 bool KHTMLPart::pFindTextNextInThisFrame(
bool reverse )
3087 kDebug() <<
"Selection is not valid. Returning empty selection";
3090 if(sel.start().offset() < 0 || sel.end().offset() < 0) {
3091 kDebug() <<
"invalid values for end/startOffset " << sel.start().offset() <<
" " << sel.end().offset();
3097 int exceptioncode = 0;
3098 return r.
handle()->toHTML(exceptioncode).string();
3103 bool hasNewLine =
true;
3104 bool seenTDTag =
false;
3110 DOM::DOMStringImpl *dstr =
static_cast<DOM::TextImpl*
>(n.
handle())->renderString();
3111 QString str(dstr->s, dstr->l);
3112 if(!str.isEmpty()) {
3118 if(n == sel.start().node() && n == sel.end().node()) {
3119 int s = khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset();
3120 int e = khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset();
3121 text = str.mid(s, e-s);
3122 }
else if(n == sel.start().node()) {
3123 text = str.mid(khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset());
3124 }
else if(n == sel.end().node()) {
3125 text += str.left(khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset());
3135 text +=
static_cast<HTMLTextAreaElementImpl*
>(n.
handle())->value().string();
3138 if (static_cast<HTMLInputElementImpl*>(n.
handle())->inputType() != HTMLInputElementImpl::PASSWORD)
3139 text += static_cast<HTMLInputElementImpl*>(n.
handle())->value().string();
3142 text +=
static_cast<HTMLSelectElementImpl*
>(n.
handle())->value().string();
3149 text +=
static_cast<HTMLImageElementImpl*
>(n.
handle())->altText().string();
3183 if(n == sel.end().node())
break;
3234 int end = text.length();
3237 while ((start < end) && (text[start] ==
'\n'))
3241 while ((start < (end-1)) && (text[end-1] ==
'\n') && (text[end-2] ==
'\n'))
3244 return text.mid(start, end-start);
3247 QString KHTMLPart::simplifiedSelectedText()
const
3250 text.replace(QChar(0xa0),
' ');
3252 while (!text.isEmpty() && text[0].isSpace())
3254 while (!text.isEmpty() && text[text.length()-1].isSpace())
3255 text.truncate(text.length()-1);
3283 const Selection &KHTMLPart::caret()
const
3288 const Selection &KHTMLPart::dragCaret()
const
3293 void KHTMLPart::setCaret(
const Selection &s,
bool closeTyping)
3296 clearCaretRectIfNeeded();
3297 setFocusNodeIfNeeded(s);
3299 notifySelectionChanged(closeTyping);
3303 void KHTMLPart::setDragCaret(
const DOM::Selection &dragCaret)
3312 void KHTMLPart::clearSelection()
3314 clearCaretRectIfNeeded();
3316 #ifdef APPLE_CHANGES
3321 notifySelectionChanged();
3324 void KHTMLPart::invalidateSelection()
3326 clearCaretRectIfNeeded();
3328 selectionLayoutChanged();
3331 void KHTMLPart::setSelectionVisible(
bool flag)
3336 clearCaretRectIfNeeded();
3343 void KHTMLPart::slotClearSelection()
3348 clearCaretRectIfNeeded();
3350 #ifdef APPLE_CHANGES
3356 notifySelectionChanged();
3360 void KHTMLPart::clearCaretRectIfNeeded()
3368 void KHTMLPart::setFocusNodeIfNeeded(
const Selection &s)
3370 if (!xmlDocImpl() || s.state() == Selection::NONE)
3373 NodeImpl *n = s.start().node();
3374 NodeImpl *target = (n && n->isContentEditable()) ? n : 0;
3376 while (n && n != s.end().node()) {
3377 if (n->isContentEditable()) {
3381 n = n->traverseNextNode();
3384 assert(target == 0 || target->isContentEditable());
3387 for ( ; target && !target->isFocusable(); target = target->parentNode())
3389 if (target && target->isMouseFocusable())
3390 xmlDocImpl()->setFocusNode(target);
3391 else if (!target || !target->focused())
3392 xmlDocImpl()->setFocusNode(0);
3396 void KHTMLPart::selectionLayoutChanged()
3415 d->
m_view->ensureVisible(r.x(), r.y());
3419 d->
m_doc->updateSelection();
3426 void KHTMLPart::notifySelectionChanged(
bool closeTyping)
3429 selectionLayoutChanged();
3437 emitSelectionChanged();
3472 int dots = name.count(
'.');
3473 if (dots > 2 || (dots == 2 && !name.startsWith(
"www.")))
3492 void KHTMLPart::paintCaret(QPainter *p,
const QRect &rect)
const
3498 void KHTMLPart::paintDragCaret(QPainter *p,
const QRect &rect)
const
3509 void KHTMLPart::resetHoverText()
3517 setStatusBarText(
QString(), BarHoverText);
3522 void KHTMLPart::overURL(
const QString &url,
const QString &target,
bool )
3527 if ( url.isEmpty() )
3532 if ( url.isEmpty() ) {
3533 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3539 jscode = KStringHandler::rsqueeze( jscode, 80 );
3540 if (url.startsWith(
"javascript:window.open"))
3541 jscode +=
i18n(
" (In new window)");
3542 setStatusBarText( Qt::escape( jscode ), BarHoverText );
3554 com = typ->comment( u );
3556 if ( !u.isValid() ) {
3557 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3567 KDE_struct_stat buff;
3568 bool ok = !KDE::stat( path, &buff );
3570 KDE_struct_stat lbuff;
3571 if (ok) ok = !KDE::lstat( path, &lbuff );
3576 if (ok && S_ISLNK( lbuff.st_mode ) )
3580 tmp =
i18n(
"Symbolic Link");
3582 tmp =
i18n(
"%1 (Link)", com);
3583 char buff_two[1024];
3585 int n = readlink ( path.toLocal8Bit().data(), buff_two, 1022);
3590 setStatusBarText(text2, BarHoverText);
3599 else if ( ok && S_ISREG( buff.st_mode ) )
3601 if (buff.st_size < 1024)
3602 text =
i18np(
"%2 (%1 byte)",
"%2 (%1 bytes)", (
long) buff.st_size, text2);
3605 float d = (float) buff.st_size/1024.0;
3606 text =
i18n(
"%2 (%1 K)", KGlobal::locale()->formatNumber(d, 2), text2);
3611 else if ( ok && S_ISDIR( buff.st_mode ) )
3621 setStatusBarText(text, BarHoverText);
3626 if (target.toLower() ==
"_blank")
3628 extra =
i18n(
" (In new window)");
3630 else if (!target.isEmpty() &&
3631 (target.toLower() !=
"_top") &&
3632 (target.toLower() !=
"_self") &&
3633 (target.toLower() !=
"_parent"))
3639 extra =
i18n(
" (In new window)");
3641 extra =
i18n(
" (In other frame)");
3644 if (u.
protocol() == QLatin1String(
"mailto")) {
3646 mailtoMsg +=
i18n(
"Email to: ") + KUrl::fromPercentEncoding(u.
path().toLatin1());
3648 QStringList::ConstIterator it = queries.begin();
3649 const QStringList::ConstIterator itEnd = queries.end();
3650 for (; it != itEnd; ++it)
3651 if ((*it).startsWith(QLatin1String(
"subject=")))
3652 mailtoMsg +=
i18n(
" - Subject: ") + KUrl::fromPercentEncoding((*it).mid(8).toLatin1());
3653 else if ((*it).startsWith(QLatin1String(
"cc=")))
3654 mailtoMsg +=
i18n(
" - CC: ") + KUrl::fromPercentEncoding((*it).mid(3).toLatin1());
3655 else if ((*it).startsWith(QLatin1String(
"bcc=")))
3656 mailtoMsg +=
i18n(
" - BCC: ") + KUrl::fromPercentEncoding((*it).mid(4).toLatin1());
3657 mailtoMsg = Qt::escape(mailtoMsg);
3658 mailtoMsg.replace(QRegExp(
"([\n\r\t]|[ ]{10})"),
QString());
3659 setStatusBarText(
"<qt>"+mailtoMsg, BarHoverText);
3664 else if (u.
protocol() == QLatin1String(
"http")) {
3669 if (!hrefNode.
isNull()) {
3671 if (!hreflangNode.
isNull()) {
3674 if (countryCode == QLatin1String(
"en"))
3675 countryCode = QLatin1String(
"gb");
3676 QString flagImg = QLatin1String(
"<img src=%1>").arg(
3677 locate(
"locale", QLatin1String(
"l10n/")
3679 + QLatin1String(
"/flag.png")));
3680 emit setStatusBarText(flagImg + u.
prettyUrl() + extra);
3685 setStatusBarText(Qt::escape(u.
prettyUrl()) + extra, BarHoverText);
3697 bool hasTarget =
false;
3700 if ( target.isEmpty() && d->m_doc )
3701 target = d->m_doc->baseTarget();
3702 if ( !target.isEmpty() )
3705 if ( d->isJavaScriptURL(url) )
3707 crossFrameExecuteScript( target, d->codeForJavaScriptURL(url) );
3713 if ( url.isEmpty() )
3716 if ( !cURL.isValid() )
3720 kDebug(6050) <<
this <<
"complete URL:" << cURL.
url() <<
"target=" << target;
3722 if ( state & Qt::ControlModifier )
3724 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3728 if ( button == Qt::LeftButton && ( state & Qt::ShiftModifier ) )
3731 metaData.insert(
"referrer", d->m_referrer );
3736 if (!checkLinkSecurity(cURL,
3737 ki18n(
"<qt>This untrusted page links to<br /><b>%1</b>.<br />Do you want to follow the link?</qt>" ),
3743 args.
metaData().insert(
"main_frame_request",
3745 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
3746 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
3747 args.
metaData().insert(
"PropagateHttpHeader",
"true");
3748 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
3749 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
3751 if ( hasTarget && target !=
"_self" && target !=
"_top" && target !=
"_blank" && target !=
"_parent" )
3754 khtml::ChildFrame *frame = recursiveFrameRequest(
this, cURL, args, browserArgs,
false );
3757 args.
metaData()[
"referrer"] = d->m_referrer;
3758 requestObject( frame, cURL, args, browserArgs );
3763 if (!d->m_referrer.isEmpty() && !args.
metaData().contains(
"referrer"))
3764 args.
metaData()[
"referrer"] = d->m_referrer;
3766 if ( button == Qt::NoButton && (state & Qt::ShiftModifier) && (state & Qt::ControlModifier) )
3768 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3772 if ( state & Qt::ShiftModifier)
3776 emit d->m_extension->createNewWindow( cURL, args, browserArgs, winArgs );
3783 if (cURL.
hasRef() && (!hasTarget || target ==
"_self"))
3785 if (d->isLocalAnchorJump(cURL))
3787 d->executeAnchorJump(cURL, browserArgs.
lockHistory() );
3792 if ( !d->m_bComplete && !hasTarget )
3795 view()->viewport()->unsetCursor();
3796 emit d->m_extension->openUrlRequest( cURL, args, browserArgs );
3800 void KHTMLPart::slotViewDocumentSource()
3803 bool isTempFile =
false;
3807 sourceFile.
setSuffix(defaultExtension());
3808 sourceFile.setAutoRemove(
false);
3809 if (sourceFile.open())
3811 QDataStream stream ( &sourceFile );
3813 currentUrl =
KUrl();
3814 currentUrl.setPath(sourceFile.fileName());
3819 (void)
KRun::runUrl( currentUrl, QLatin1String(
"text/plain"),
view(), isTempFile );
3822 void KHTMLPart::slotViewPageInfo()
3827 dlg->setAttribute(Qt::WA_DeleteOnClose);
3828 dlg->setObjectName(
"KHTML Page Info Dialog");
3831 ui._close->setGuiItem(KStandardGuiItem::close());
3832 connect(ui._close, SIGNAL(clicked()), dlg, SLOT(accept()));
3835 ui._title->setText(d->m_doc->title().string().trimmed());
3838 if (
parentPart() && d->m_doc && d->m_doc->isHTMLDocument() ) {
3839 dlg->setWindowTitle(
i18n(
"Frame Information"));
3844 if (!d->m_pageServices.isEmpty())
3845 editStr =
i18n(
" <a href=\"%1\">[Properties]</a>", d->m_pageServices);
3847 QString squeezedURL = KStringHandler::csqueeze(
url().prettyUrl(), 80 );
3848 ui._url->setText(
"<a href=\"" +
url().
url() +
"\">" + squeezedURL +
"</a>" + editStr);
3851 ui._lastModified->hide();
3852 ui._lmLabel->hide();
3858 if (enc.isEmpty()) {
3860 ui._encoding->hide();
3862 ui._encoding->setText(enc);
3865 if (!xmlDocImpl() || xmlDocImpl()->parseMode() == DOM::DocumentImpl::Unknown) {
3867 ui._modeLabel->hide();
3869 switch (xmlDocImpl()->parseMode()) {
3870 case DOM::DocumentImpl::Compat:
3871 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Quirks"));
3873 case DOM::DocumentImpl::Transitional:
3874 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Almost standards"));
3876 case DOM::DocumentImpl::Strict:
3878 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Strict"));
3884 const QStringList headers = d->m_httpHeaders.split(
"\n");
3886 QStringList::ConstIterator it = headers.begin();
3887 const QStringList::ConstIterator itEnd = headers.end();
3889 for (; it != itEnd; ++it) {
3891 if (header.count() != 2)
3893 QTreeWidgetItem *item =
new QTreeWidgetItem(ui._headers);
3894 item->setText(0, header[0]);
3895 item->setText(1, header[1]);
3903 void KHTMLPart::slotViewFrameSource()
3910 bool isTempFile =
false;
3911 if (!(url.
isLocalFile()) && frame->inherits(
"KHTMLPart"))
3913 long cacheId =
static_cast<KHTMLPart *
>(frame)->d->m_cacheId;
3918 sourceFile.
setSuffix(defaultExtension());
3919 sourceFile.setAutoRemove(
false);
3920 if (sourceFile.open())
3922 QDataStream stream ( &sourceFile );
3925 url.
setPath(sourceFile.fileName());
3931 (void)
KRun::runUrl( url, QLatin1String(
"text/plain"),
view(), isTempFile );
3937 if (!d->m_doc || !d->m_doc->isHTMLDocument())
3940 QString relURL =
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
3945 void KHTMLPart::slotSaveBackground()
3948 metaData[
"referrer"] = d->m_referrer;
3952 void KHTMLPart::slotSaveDocument()
3957 srcURL.setFileName(
"index" + defaultExtension() );
3964 void KHTMLPart::slotSecurity()
3988 const QStringList sl = d->m_ssl_peer_chain.split(
'\n', QString::SkipEmptyParts);
3990 bool certChainOk = d->m_ssl_in_use;
3992 foreach (
const QString &s, sl) {
3993 certChain.append(QSslCertificate(s.toLatin1()));
3994 if (certChain.last().isNull()) {
3995 certChainOk =
false;
4001 kid->setup(certChain,
4005 d->m_ssl_cipher_desc,
4006 d->m_ssl_cipher_version,
4007 d->m_ssl_cipher_used_bits.toInt(),
4008 d->m_ssl_cipher_bits.toInt(),
4017 QStringList sl = d->m_ssl_peer_chain.split(
'\x01', QString::SkipEmptyParts);
4019 bool decodedOk =
true;
4020 foreach (
const QString &s, sl) {
4021 certChain.append(QSslCertificate(s.toLatin1()));
4022 if (certChain.last().isNull()) {
4028 if (decodedOk ||
true ) {
4032 d->m_ssl_protocol_version,
4034 d->m_ssl_cipher_used_bits.toInt(),
4035 d->m_ssl_cipher_bits.toInt(),
4037 kDebug(7024) <<
"Showing SSL Info dialog";
4039 kDebug(7024) <<
"SSL Info dialog closed";
4042 "appears to be corrupt."),
4047 void KHTMLPart::slotSaveFrame()
4056 srcURL.
setFileName(
"index" + defaultExtension() );
4063 void KHTMLPart::slotSetEncoding(
const QString &enc)
4071 d->m_autoDetectLanguage=scri;
4075 void KHTMLPart::slotUseStylesheet()
4079 bool autoselect = (d->m_paUseStylesheet->currentItem() == 0);
4080 d->m_sheetUsed = autoselect ?
QString() : d->m_paUseStylesheet->currentText();
4081 d->m_doc->updateStyleSelector();
4085 void KHTMLPart::updateActions()
4087 bool frames =
false;
4091 for (; it !=
end; ++it )
4098 if (d->m_paViewFrame)
4099 d->m_paViewFrame->setEnabled( frames );
4100 if (d->m_paSaveFrame)
4101 d->m_paSaveFrame->setEnabled( frames );
4104 d->m_paFind->setText(
i18n(
"&Find in Frame..." ) );
4106 d->m_paFind->setText(
i18n(
"&Find..." ) );
4113 bool enableFindAndSelectAll =
true;
4116 enableFindAndSelectAll = frame->inherits(
"KHTMLPart" );
4118 d->m_paFind->setEnabled( enableFindAndSelectAll );
4119 d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
4121 bool enablePrintFrame =
false;
4127 enablePrintFrame = ext->metaObject()->indexOfSlot(
"print()" ) != -1;
4130 d->m_paPrintFrame->setEnabled( enablePrintFrame );
4135 if ( d->m_doc && d->m_doc->isHTMLDocument() &&
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body() && !d->m_bClearing )
4136 bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4138 if (d->m_paSaveBackground)
4139 d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
4141 if ( d->m_paDebugScript )
4142 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
4148 if ((*it)->m_partContainerElement.data() == frame)
4149 return (*it)->m_scriptable.data();
4153 void KHTMLPart::loadFrameElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4159 FrameIt it = d->m_frames.find( frameName );
4160 if ( it == d->m_frames.end() ) {
4163 child->
m_name = frameName;
4164 d->m_frames.insert( d->m_frames.end(), child );
4176 QString khtml = QString::fromLatin1(
"khtml");
4178 QString::fromLatin1(
"text/html"),
4185 navigateLocalProtocol(child, part,
KUrl(
"about:blank"));
4186 connectToChildPart(child, part,
"text/html" );
4196 if (!requestObject( child, u ) && !child->
m_run) {
4201 QString KHTMLPart::requestFrameName()
4203 return QString::fromLatin1(
"<!--frame %1-->").arg(d->m_frameNameId++);
4206 bool KHTMLPart::loadObjectElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4211 FrameIt it = d->m_objects.insert( d->m_objects.end(), child );
4214 (*it)->m_params = params;
4218 if (!requestObject( *it,
completeURL( url ), args ) && !(*it)->m_run) {
4219 (*it)->m_bCompleted =
true;
4230 if (!d->isJavaScriptURL(url.
url()) && !checkLinkSecurity(url))
4232 kDebug(6031) <<
this <<
"checkLinkSecurity refused";
4254 if ( child->
m_run ) {
4255 kDebug(6031) <<
"navigating ChildFrame while mimetype resolution was in progress...";
4256 child->
m_run.data()->abort();
4272 if (!d->m_referrer.isEmpty() && !child->
m_args.
metaData().contains(
"referrer" ))
4276 child->
m_args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4277 child->
m_args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4281 d->m_ssl_in_use ?
"TRUE":
"FALSE");
4282 child->
m_args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4288 if ((url.isEmpty() || url.
url() ==
"about:blank" || url.
protocol() ==
"javascript") && args.
mimeType().isEmpty())
4292 kDebug(6031) <<
"Running new KHTMLRun for" <<
this <<
"and child=" << child;
4294 d->m_bComplete =
false;
4297 return processObjectRequest( child, url, args.
mimeType() );
4312 kDebug( 6031 ) <<
"trying to create part for" << mimetype << _url;
4322 if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) ) {
4323 childLoadFailure(child);
4335 emit d->m_extension->openUrlNotify();
4349 (child->
m_run && child->
m_run.data()->serverSuggestsSave())) {
4368 int disposition = 0;
4370 suggestedFileName =
run->suggestedFileName();
4371 disposition =
run->serverSuggestsSave() ?
4377 dlg.setSuggestedFileName( suggestedFileName );
4402 if (mime->is(
"text/html")
4403 || mime->is(
"application/xml")) {
4407 childLoadFailure(child);
4417 childLoadFailure(child);
4421 connectToChildPart( child, part, mimetype );
4425 checkEmitLoadEvent();
4458 return navigateChild( child, url );
4464 if (!qobject_cast<KHTMLPart*>(inPart))
4472 d->propagateInitialDomainAndBaseTo(p);
4475 if (d->isJavaScriptURL(url.
url())) {
4478 d->codeForJavaScriptURL(url.
url()));
4483 d->propagateInitialDomainAndBaseTo(p);
4484 p->
write( res.toString() );
4490 p->
write(
"<HTML><TITLE></TITLE><BODY></BODY></HTML>");
4500 if (url.
protocol() ==
"javascript" || url.
url() ==
"about:blank") {
4501 return navigateLocalProtocol(child, child->
m_part.data(),
url);
4502 }
else if ( !url.isEmpty() ) {
4503 kDebug( 6031 ) <<
"opening" << url <<
"in frame" << child->
m_part;
4504 bool b = child->
m_part.data()->openUrl( url );
4519 kDebug(6031) <<
"we:" <<
this <<
"kid:" << child << part << mimetype;
4521 part->setObjectName( child->
m_name );
4525 if (!qobject_cast<KHTMLPart*>(p) && child->
m_jscript)
4543 if (qobject_cast<KHTMLPart*>(part)) {
4544 static_cast<KHTMLPart*
>(part)->d->m_frame = child;
4556 scriptExt->
setHost(d->m_scriptableExtension);
4561 sb->
setStatusBar( d->m_statusBarExtension->statusBar() );
4564 this, SLOT(slotChildStarted(
KIO::Job*)) );
4566 this, SLOT(slotChildCompleted()) );
4568 this, SLOT(slotChildCompleted(
bool)) );
4569 connect( part, SIGNAL(setStatusBarText(
QString)),
4570 this, SIGNAL(setStatusBarText(
QString)) );
4571 if ( part->inherits(
"KHTMLPart" ) )
4574 part, SLOT(slotParentCompleted()) );
4576 part, SLOT(slotParentCompleted()) );
4580 this, SLOT(slotChildDocCreated()) );
4587 connect( kidBrowserExt, SIGNAL(openUrlNotify()),
4588 d->m_extension, SIGNAL(openUrlNotify()) );
4601 connect( kidBrowserExt, SIGNAL(infoMessage(
QString)),
4602 d->m_extension, SIGNAL(infoMessage(
QString)) );
4607 kidBrowserExt->setBrowserInterface( d->m_extension->browserInterface() );
4617 if ( !serviceName.isEmpty() )
4618 constr.append( QString::fromLatin1(
"DesktopEntryName == '%1'" ).arg( serviceName ) );
4622 if ( offers.isEmpty() ) {
4623 int pos = mimetype.indexOf(
"-plugin" );
4626 QString stripped_mime = mimetype.left( pos );
4628 if ( offers.isEmpty() )
4632 KService::List::ConstIterator it = offers.constBegin();
4633 const KService::List::ConstIterator itEnd = offers.constEnd();
4634 for ( ; it != itEnd; ++it )
4642 QVariantList variantlist;
4643 Q_FOREACH(
const QString& str, params)
4646 if ( service->
serviceTypes().contains(
"Browser/View" ) )
4647 variantlist <<
QString(
"Browser/View");
4652 serviceName = service->name();
4657 kWarning() <<
QString(
"There was an error loading the module %1.\nThe diagnostics is:\n%2")
4666 if ( !d->m_manager && d->m_view )
4669 d->m_manager->setObjectName(
"khtml part manager" );
4671 connect( d->m_manager, SIGNAL(activePartChanged(
KParts::Part*)),
4673 connect( d->m_manager, SIGNAL(partRemoved(
KParts::Part*)),
4677 return d->m_manager;
4680 void KHTMLPart::submitFormAgain()
4682 disconnect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4683 if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
4684 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 );
4686 delete d->m_submitForm;
4687 d->m_submitForm = 0;
4692 submitForm(action, url, formData, _target, contentType, boundary);
4695 void KHTMLPart::submitForm(
const char *action,
const QString &url,
const QByteArray &formData,
const QString &_target,
const QString& contentType,
const QString& boundary )
4697 kDebug(6000) <<
this <<
"target=" << _target <<
"url=" <<
url;
4725 if (!d->m_submitForm) {
4727 if (d->m_ssl_in_use) {
4729 "\nA third party may be able to intercept and view this information."
4730 "\nAre you sure you wish to continue?"),
4736 if (kss.warnOnUnencrypted()) {
4738 i18n(
"Warning: Your data is about to be transmitted across the network unencrypted."
4739 "\nAre you sure you wish to continue?"),
4740 i18n(
"Network Transmission"),
4742 KStandardGuiItem::cancel(),
4743 "WarnOnUnencryptedForm");
4745 QString grpNotifMsgs = QLatin1String(
"Notification Messages");
4748 if (!cg.readEntry(
"WarnOnUnencryptedForm",
true)) {
4749 cg.deleteEntry(
"WarnOnUnencryptedForm");
4751 kss.setWarnOnUnencrypted(
false);
4762 i18n(
"This site is attempting to submit form data via email.\n"
4763 "Do you want to continue?"),
4764 i18n(
"Network Transmission"),
4766 KStandardGuiItem::cancel(),
4767 "WarnTriedEmailSubmit");
4780 if ( d->isJavaScriptURL(urlstring) ) {
4781 crossFrameExecuteScript( _target, d->codeForJavaScriptURL(urlstring) );
4785 if (!checkLinkSecurity(u,
4786 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>" ),
4792 d->clearRedirection();
4796 if (!d->m_referrer.isEmpty())
4797 args.
metaData()[
"referrer"] = d->m_referrer;
4799 args.
metaData().insert(
"PropagateHttpHeader",
"true");
4800 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4801 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4802 args.
metaData().insert(
"main_frame_request",
4804 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
4805 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4810 browserArgs.
frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
4817 bool triedToAttach =
false;
4819 QStringList::Iterator nvp = nvps.begin();
4820 const QStringList::Iterator nvpEnd = nvps.end();
4825 while (nvp != nvpEnd) {
4827 if (pair.count() >= 2) {
4828 if (pair.first().toLower() ==
"attach") {
4829 nvp = nvps.erase(nvp);
4830 triedToAttach =
true;
4840 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");
4844 if (contentType.toLower() ==
"multipart/form-data") {
4846 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4848 }
else if (contentType.toLower() ==
"text/plain") {
4850 QString tmpbody = QString::fromLatin1(formData.data(),
4852 tmpbody.replace(QRegExp(
"[&]"),
"\n");
4853 tmpbody.replace(QRegExp(
"[+]"),
" ");
4854 tmpbody = KUrl::fromPercentEncoding(tmpbody.toLatin1());
4855 bodyEnc = QLatin1String( KUrl::toPercentEncoding(tmpbody) );
4857 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4858 formData.size())) );
4861 nvps.append(
QString(
"body=%1").arg(bodyEnc));
4866 if (
strcmp( action,
"get" ) == 0 ) {
4868 u.
setQuery( QString::fromLatin1( formData.data(), formData.size() ) );
4876 if (contentType.isNull() || contentType ==
"application/x-www-form-urlencoded")
4877 browserArgs.
setContentType(
"Content-Type: application/x-www-form-urlencoded" );
4879 browserArgs.
setContentType(
"Content-Type: " + contentType +
"; boundary=" + boundary );
4882 if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
4883 if( d->m_submitForm ) {
4884 kDebug(6000) <<
"ABORTING!";
4889 d->m_submitForm->submitUrl =
url;
4890 d->m_submitForm->submitFormData = formData;
4891 d->m_submitForm->target = _target;
4892 d->m_submitForm->submitContentType = contentType;
4893 d->m_submitForm->submitBoundary = boundary;
4894 connect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4898 emit d->m_extension->openUrlRequest( u, args, browserArgs );
4911 if ( linkUrl.isEmpty() ) {
4917 popupURL = khtmlPart->
url();
4925 linkKUrl = popupURL;
4929 if (!(d->m_strSelectedURLTarget).isEmpty() &&
4930 (d->m_strSelectedURLTarget.toLower() !=
"_top") &&
4931 (d->m_strSelectedURLTarget.toLower() !=
"_self") &&
4932 (d->m_strSelectedURLTarget.toLower() !=
"_parent")) {
4933 if (d->m_strSelectedURLTarget.toLower() ==
"_blank")
4948 QPointer<QObject> guard( client );
4950 QString mimetype = QLatin1String(
"text/html" );
4953 if (!linkUrl.isEmpty())
4957 mimetype = KMimeType::findByUrl(popupURL,0,
true,
false)->name();
4962 if (!fname.isEmpty() && !popupURL.
hasRef() && popupURL.
query().isEmpty())
4970 if (pmt->name() != KMimeType::defaultMimeType() &&
4971 !pmt->is(
"application/x-perl") &&
4972 !pmt->is(
"application/x-perl-module") &&
4973 !pmt->is(
"application/x-php") &&
4974 !pmt->is(
"application/x-python-bytecode") &&
4975 !pmt->is(
"application/x-python") &&
4976 !pmt->is(
"application/x-shellscript"))
4977 mimetype = pmt->name();
4984 emit d->m_extension->popupMenu( QCursor::pos(), popupURL, S_IFREG ,
4985 args, browserArgs, itemflags,
4988 if ( !guard.isNull() ) {
4990 emit
popupMenu(linkUrl, QCursor::pos());
4991 d->m_strSelectedURL.clear();
4992 d->m_strSelectedURLTarget.clear();
4996 void KHTMLPart::slotParentCompleted()
4999 if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
5002 d->m_redirectionTimer.setSingleShot(
true );
5003 d->m_redirectionTimer.start( qMax(0, 1000 * d->m_delayRedirect) );
5007 void KHTMLPart::slotChildStarted(
KIO::Job *job )
5015 if ( d->m_bComplete )
5021 emit d->m_extension->openURLNotify();
5024 d->m_bComplete =
false;
5029 void KHTMLPart::slotChildCompleted()
5031 slotChildCompleted(
false );
5034 void KHTMLPart::slotChildCompleted(
bool pendingAction )
5046 if (!qobject_cast<KHTMLPart*>(child->
m_part))
5052 void KHTMLPart::slotChildDocCreated()
5057 if (
KHTMLPart* htmlFrame = qobject_cast<KHTMLPart*>(sender()))
5058 d->propagateInitialDomainAndBaseTo(htmlFrame);
5061 disconnect( sender(), SIGNAL(
docCreated()),
this, SLOT(slotChildDocCreated()) );
5068 if ( m_doc && kid->d->
m_doc ) {
5069 DocumentImpl* kidDoc = kid->d->
m_doc;
5070 if ( kidDoc->origin()->isEmpty() ) {
5071 kidDoc->setOrigin ( m_doc->origin() );
5072 kidDoc->setBaseURL( m_doc->baseURL() );
5084 if ( d->isJavaScriptURL(urlStr) ) {
5090 if ( !frameName.isEmpty() ) {
5091 if ( frameName == QLatin1String(
"_top" ) )
5093 emit d->m_extension->openUrlRequest( url, args, browserArgs );
5096 else if ( frameName == QLatin1String(
"_blank" ) )
5098 emit d->m_extension->createNewWindow( url, args, browserArgs );
5101 else if ( frameName == QLatin1String(
"_parent" ) )
5104 newBrowserArgs.frameName.clear();
5105 emit d->m_extension->openUrlRequest( url, args, newBrowserArgs );
5108 else if ( frameName != QLatin1String(
"_self" ) )
5110 khtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args, browserArgs );
5114 emit d->m_extension->openUrlRequest( url, args, browserArgs );
5125 requestObject( child, url, args, browserArgs );
5126 }
else if ( frameName==
"_self" )
5129 newBrowserArgs.frameName.clear();
5130 emit d->m_extension->openUrlRequest( url, args, newBrowserArgs );
5136 emit d->m_extension->requestFocus(
this);
5141 assert( obj->inherits(
"KParts::ReadOnlyPart" ) );
5144 FrameIt it = d->m_frames.begin();
5145 const FrameIt end = d->m_frames.end();
5146 for (; it !=
end; ++it ) {
5147 if ((*it)->m_part.data() == part )
5151 FrameIt oi = d->m_objects.begin();
5152 const FrameIt oiEnd = d->m_objects.end();
5153 for (; oi != oiEnd; ++oi ) {
5154 if ((*oi)->m_part.data() == part)
5163 bool KHTMLPart::checkFrameAccess(
KHTMLPart *callingHtmlPart)
5165 if (callingHtmlPart ==
this)
5168 if (!xmlDocImpl()) {
5169 #ifdef DEBUG_FINDFRAME
5170 kDebug(6050) <<
"Empty part" <<
this <<
"URL = " <<
url();
5176 if (callingHtmlPart && callingHtmlPart->xmlDocImpl() && xmlDocImpl()) {
5177 khtml::SecurityOrigin* actDomain = callingHtmlPart->xmlDocImpl()->origin();
5178 khtml::SecurityOrigin* destDomain = xmlDocImpl()->origin();
5180 if (actDomain->canAccess(destDomain))
5183 #ifdef DEBUG_FINDFRAME
5186 kDebug(6050) <<
"Unknown part/domain" << callingHtmlPart <<
"tries to access part" <<
this;
5201 #ifdef DEBUG_FINDFRAME
5202 kDebug(6050) << q <<
"URL =" << q->url() <<
"name =" << q->objectName() <<
"findFrameParent(" << f <<
")";
5207 if (!callingHtmlPart)
5210 if (!checkForNavigation && !q->checkFrameAccess(callingHtmlPart))
5213 if (!childFrame && !q->parentPart() && (q->objectName() == f)) {
5214 if (!checkForNavigation || callingHtmlPart->d->
canNavigate(q))
5218 FrameIt it = m_frames.find( f );
5219 const FrameIt end = m_frames.end();
5222 #ifdef DEBUG_FINDFRAME
5223 kDebug(6050) <<
"FOUND!";
5225 if (!checkForNavigation || callingHtmlPart->d->
canNavigate((*it)->m_part.data())) {
5232 it = m_frames.begin();
5233 for (; it !=
end; ++it )
5235 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5265 if (q->checkFrameAccess(b))
5269 if (q->parentPart() && top() == b)
5274 if (b->opener() && canNavigate(b->opener()))
5279 if (anc->checkFrameAccess(q))
5308 while ( part && part->inherits(
"KHTMLPart") &&
5309 static_cast<KHTMLPart *
>(part)->d->m_frames.count() > 0 ) {
5312 if ( !part )
return frameset;
5319 FrameIt it = d->m_frames.find( frameName );
5320 if ( it == d->m_frames.end() )
5326 return (!(*it)->m_partContainerElement.isNull());
5332 for (
int i = 0; i < m_frames.size(); ++i) {
5343 return kp->jScript();
5345 FrameIt it = d->m_frames.begin();
5346 const FrameIt itEnd = d->m_frames.end();
5348 for (; it != itEnd; ++it) {
5350 if (framePart == frame->
m_part.data()) {
5361 return qobject_cast<
KHTMLPart*>( parent() );
5368 #ifdef DEBUG_FINDFRAME
5375 if (childPart ==
this)
5378 childPart->requestObject( childFrame, url, args, browserArgs );
5387 parentPart()->requestObject( res, url, args, browserArgs );
5393 #ifdef DEBUG_SAVESTATE
5394 static int s_saveStateIndentLevel = 0;
5399 #ifdef DEBUG_SAVESTATE
5401 const int indentLevel = s_saveStateIndentLevel++;
5402 kDebug( 6050 ) << indent <<
"saveState this=" <<
this <<
" '" << objectName() <<
"' saving URL " <<
url().
url();
5405 stream <<
url() << (
qint32)d->m_view->contentsX() << (
qint32)d->m_view->contentsY()
5406 << (
qint32) d->m_view->contentsWidth() << (
qint32) d->m_view->contentsHeight() << (
qint32) d->m_view->marginWidth() << (
qint32) d->m_view->marginHeight();
5409 int focusNodeNumber;
5410 if (!d->m_focusNodeRestored)
5411 focusNodeNumber = d->m_focusNodeNumber;
5412 else if (d->m_doc && d->m_doc->focusNode())
5413 focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
5415 focusNodeNumber = -1;
5416 stream << focusNodeNumber;
5419 stream << d->m_cacheId;
5425 docState = d->m_doc->docState();
5427 stream << d->m_encoding << d->m_sheetUsed << docState;
5429 stream << d->m_zoomFactor;
5430 stream << d->m_fontScaleFactor;
5432 stream << d->m_httpHeaders;
5433 stream << d->m_pageServices;
5434 stream << d->m_pageReferrer;
5437 stream << d->m_ssl_in_use
5438 << d->m_ssl_peer_chain
5441 << d->m_ssl_protocol_version
5442 << d->m_ssl_cipher_used_bits
5443 << d->m_ssl_cipher_bits
5444 << d->m_ssl_cert_errors
5445 << d->m_ssl_parent_ip
5446 << d->m_ssl_parent_cert;
5449 QStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
5456 for (; it !=
end; ++it )
5458 if ( !(*it)->m_part )
5461 frameNameLst << (*it)->m_name;
5462 frameServiceTypeLst << (*it)->m_serviceType;
5463 frameServiceNameLst << (*it)->m_serviceName;
5464 frameURLLst << (*it)->m_part.data()->url();
5467 QDataStream frameStream( &state, QIODevice::WriteOnly );
5469 if ( (*it)->m_extension )
5470 (*it)->m_extension.data()->saveState( frameStream );
5472 frameStateBufferLst << state;
5474 frameTypeLst << int( (*it)->m_type );
5478 stream << (
quint32) frameNameLst.count();
5479 stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst << frameTypeLst;
5480 #ifdef DEBUG_SAVESTATE
5481 s_saveStateIndentLevel = indentLevel;
5488 qint32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
5496 long old_cacheId = d->m_cacheId;
5498 stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
5500 d->m_view->setMarginWidth( mWidth );
5501 d->m_view->setMarginHeight( mHeight );
5505 stream >> d->m_focusNodeNumber;
5506 d->m_focusNodeRestored =
false;
5508 stream >> d->m_cacheId;
5510 stream >> encoding >> sheetUsed >> docState;
5513 d->m_sheetUsed = sheetUsed;
5523 stream >> d->m_httpHeaders;
5524 stream >> d->m_pageServices;
5525 stream >> d->m_pageReferrer;
5528 stream >> d->m_ssl_in_use
5529 >> d->m_ssl_peer_chain
5532 >> d->m_ssl_protocol_version
5533 >> d->m_ssl_cipher_used_bits
5534 >> d->m_ssl_cipher_bits
5535 >> d->m_ssl_cert_errors
5536 >> d->m_ssl_parent_ip
5537 >> d->m_ssl_parent_cert;
5541 stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
5542 >> frameURLs >> frameStateBuffers >> frameTypes;
5544 d->m_bComplete =
false;
5545 d->m_bLoadEventEmitted =
false;
5551 if (d->m_cacheId == old_cacheId &&
signed(frameCount) == d->m_frames.count())
5554 d->m_redirectionTimer.stop();
5556 FrameIt fIt = d->m_frames.begin();
5557 const FrameIt fEnd = d->m_frames.end();
5559 for (; fIt != fEnd; ++fIt )
5560 (*fIt)->m_bCompleted =
false;
5562 fIt = d->m_frames.begin();
5564 QStringList::ConstIterator fNameIt = frameNames.constBegin();
5565 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.constBegin();
5566 QStringList::ConstIterator fServiceNameIt = frameServiceNames.constBegin();
5567 KUrl::List::ConstIterator fURLIt = frameURLs.constBegin();
5571 for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt, ++fFrameTypeIt )
5580 child->
m_name = *fNameIt;
5583 processObjectRequest( child, *fURLIt, *fServiceTypeIt );
5588 if ( child->
m_extension && !(*fBufferIt).isEmpty() )
5590 QDataStream frameStream( *fBufferIt );
5591 child->
m_extension.data()->restoreState( frameStream );
5594 child->
m_part.data()->openUrl( *fURLIt );
5605 d->m_extension->setBrowserArguments(browserArgs);
5607 d->m_view->resizeContents( wContents, hContents );
5608 d->m_view->setContentsPos( xOffset, yOffset );
5618 d->m_bCleared =
false;
5621 d->m_sheetUsed = sheetUsed;
5623 QStringList::ConstIterator fNameIt = frameNames.constBegin();
5624 const QStringList::ConstIterator fNameEnd = frameNames.constEnd();
5626 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.constBegin();
5627 QStringList::ConstIterator fServiceNameIt = frameServiceNames.constBegin();
5628 KUrl::List::ConstIterator fURLIt = frameURLs.constBegin();
5632 for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt, ++fFrameTypeIt )
5636 newChild->
m_name = *fNameIt;
5642 const FrameIt childFrame = d->m_frames.insert( d->m_frames.end(), newChild );
5644 processObjectRequest( *childFrame, *fURLIt, *fServiceTypeIt );
5646 (*childFrame)->m_bPreloaded =
true;
5648 if ( (*childFrame)->m_part )
5650 if ( (*childFrame)->m_extension && !(*fBufferIt).isEmpty() )
5652 QDataStream frameStream( *fBufferIt );
5653 (*childFrame)->m_extension.data()->restoreState( frameStream );
5656 (*childFrame)->m_part.data()->openUrl( *fURLIt );
5667 d->m_extension->setBrowserArguments(browserArgs);
5671 d->m_restored =
true;
5673 d->m_restored =
false;
5697 return d->m_view->nodeUnderMouse();
5702 return d->m_view->nonSharedNodeUnderMouse();
5705 void KHTMLPart::emitSelectionChanged()
5709 if (!d->m_activeFrame)
5711 emit d->m_extension->enableAction(
"copy",
hasSelection() );
5719 return d->m_zoomFactor;
5723 static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
5732 void KHTMLPart::slotIncZoom()
5734 zoomIn(zoomSizes, zoomSizeCount);
5737 void KHTMLPart::slotDecZoom()
5739 zoomOut(zoomSizes, zoomSizeCount);
5742 void KHTMLPart::slotIncZoomFast()
5744 zoomIn(fastZoomSizes, fastZoomSizeCount);
5747 void KHTMLPart::slotDecZoomFast()
5749 zoomOut(fastZoomSizes, fastZoomSizeCount);
5752 void KHTMLPart::zoomIn(
const int stepping[],
int count)
5756 if (zoomFactor < maxZoom) {
5758 for (
int i = 0; i < count; ++i)
5759 if (stepping[i] > zoomFactor) {
5760 zoomFactor = stepping[i];
5767 void KHTMLPart::zoomOut(
const int stepping[],
int count)
5769 int zoomFactor = d->m_zoomFactor;
5770 if (zoomFactor > minZoom) {
5772 for (
int i = count-1; i >= 0; --i)
5773 if (stepping[i] < zoomFactor) {
5774 zoomFactor = stepping[i];
5785 if (percent < 100) percent = 100;
5788 if (percent > maxZoom) percent =
maxZoom;
5789 if (d->m_zoomFactor == percent)
return;
5790 d->m_zoomFactor = percent;
5799 QApplication::setOverrideCursor( Qt::WaitCursor );
5800 d->m_view->setZoomLevel( d->m_zoomFactor );
5801 QApplication::restoreOverrideCursor();
5806 for (; it !=
end; ++it ) {
5807 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5812 d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
5813 d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
5817 void KHTMLPart::slotIncFontSize()
5819 incFontSize(zoomSizes, zoomSizeCount);
5822 void KHTMLPart::slotDecFontSize()
5824 decFontSize(zoomSizes, zoomSizeCount);
5827 void KHTMLPart::slotIncFontSizeFast()
5829 incFontSize(fastZoomSizes, fastZoomSizeCount);
5832 void KHTMLPart::slotDecFontSizeFast()
5834 decFontSize(fastZoomSizes, fastZoomSizeCount);
5837 void KHTMLPart::incFontSize(
const int stepping[],
int count)
5839 int zoomFactor = d->m_fontScaleFactor;
5841 if (zoomFactor < maxZoom) {
5843 for (
int i = 0; i < count; ++i)
5844 if (stepping[i] > zoomFactor) {
5845 zoomFactor = stepping[i];
5852 void KHTMLPart::decFontSize(
const int stepping[],
int count)
5854 int zoomFactor = d->m_fontScaleFactor;
5855 if (zoomFactor > minZoom) {
5857 for (
int i = count-1; i >= 0; --i)
5858 if (stepping[i] < zoomFactor) {
5859 zoomFactor = stepping[i];
5868 if (percent < minZoom) percent =
minZoom;
5869 if (percent > maxZoom) percent =
maxZoom;
5870 if (d->m_fontScaleFactor == percent)
return;
5871 d->m_fontScaleFactor = percent;
5873 if (d->m_view && d->m_doc) {
5874 QApplication::setOverrideCursor( Qt::WaitCursor );
5875 if (d->m_doc->styleSelector())
5876 d->m_doc->styleSelector()->computeFontSizes(d->m_doc->logicalDpiY(), d->m_fontScaleFactor);
5877 d->m_doc->recalcStyle( NodeImpl::Force );
5878 QApplication::restoreOverrideCursor();
5883 for (; it !=
end; ++it ) {
5884 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5891 return d->m_fontScaleFactor;
5894 void KHTMLPart::slotZoomView(
int delta )
5902 void KHTMLPart::setStatusBarText(
const QString& text, StatusBarPriority p)
5904 if (!d->m_statusMessagesEnabled)
5907 d->m_statusBarText[p] = text;
5910 QString tobe = d->m_statusBarText[BarHoverText];
5912 tobe = d->m_statusBarText[BarOverrideText];
5913 if (tobe.isEmpty()) {
5914 tobe = d->m_statusBarText[BarDefaultText];
5915 if (!tobe.isEmpty() && d->m_jobspeed)
5918 tobe +=
i18n(
"(%1/s)" , KIO::convertSize( d->m_jobspeed ) );
5922 emit ReadOnlyPart::setStatusBarText(tobe);
5928 setStatusBarText(text, BarOverrideText);
5933 setStatusBarText(text, BarDefaultText);
5938 return d->m_statusBarText[BarOverrideText];
5943 return d->m_statusBarText[BarDefaultText];
5948 return d->m_referrer;
5953 KUrl referrerURL =
KUrl( d->m_pageReferrer );
5954 if (referrerURL.isValid())
5958 if ((protocol ==
"http") ||
5959 ((protocol ==
"https") && (
url().protocol() ==
"https")))
5964 return referrerURL.
url();
5978 QDateTime lastModif = QFileInfo(
url().toLocalFile() ).lastModified();
5979 d->m_lastModified = lastModif.toString( Qt::LocalDate );
5982 return d->m_lastModified;
5985 void KHTMLPart::slotLoadImages()
5988 d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
5992 for (; it !=
end; ++it ) {
5993 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5994 p->slotLoadImages();
5998 void KHTMLPart::reparseConfiguration()
6005 d->m_doc->docLoader()->setShowAnimations( settings->
showAnimations() );
6014 delete d->m_settings;
6017 QApplication::setOverrideCursor( Qt::WaitCursor );
6018 khtml::CSSStyleSelector::reparseConfiguration();
6019 if(d->m_doc) d->m_doc->updateStyleSelector();
6020 QApplication::restoreOverrideCursor();
6042 for (; it !=
end; ++it )
6043 if (!(*it)->m_bPreloaded && (*it)->m_part)
6044 res += (*it)->m_name;
6055 for (; it !=
end; ++it )
6056 if (!(*it)->m_bPreloaded && (*it)->m_part)
6058 res.append( (*it)->m_part.data() );
6068 if ( it == d->m_frames.end() )
6073 emit d->m_extension->openUrlNotify();
6075 requestObject( *it, url, args, browserArgs );
6128 if (d->editor_context.m_selection.state() == Selection::CARET)
6130 if (!xmlDocImpl()->renderer())
6133 khtml::RenderObject::NodeInfo nodeInfo(
true,
true);
6134 xmlDocImpl()->renderer()->layer()->nodeAtPoint(nodeInfo, x, y);
6135 NodeImpl *innerNode = nodeInfo.innerNode();
6136 if (!innerNode || !innerNode->renderer())
6139 return innerNode->isPointInsideSelection(x, y, d->editor_context.m_selection);
6147 static bool firstRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&startNode,
long &startOffset)
6149 for (khtml::RenderObject *n = renderNode; n; n = n->nextSibling()) {
6151 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
6152 for (khtml::InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
6153 if (box->m_y == y && textRenderer->element()) {
6154 startNode = textRenderer->element();
6155 startOffset = box->m_start;
6161 if (
firstRunAt(n->firstChild(), y, startNode, startOffset)) {
6174 static bool lastRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&endNode,
long &endOffset)
6176 khtml::RenderObject *n = renderNode;
6180 khtml::RenderObject *
next;
6181 while ((next = n->nextSibling())) {
6186 if (
lastRunAt(n->firstChild(), y, endNode, endOffset)) {
6191 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
6192 for (khtml::InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
6193 if (box->m_y == y && textRenderer->element()) {
6194 endNode = textRenderer->element();
6195 endOffset = box->m_start + box->m_len;
6201 if (n == renderNode) {
6205 n = n->previousSibling();
6211 QMouseEvent *mouse =
event->qmouseEvent();
6212 DOM::Node innerNode =
event->innerNode();
6216 if (mouse->button() == Qt::LeftButton && !innerNode.
isNull() && innerNode.
handle()->renderer() &&
6217 innerNode.
handle()->renderer()->shouldSelect()) {
6218 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6219 if (pos.node() && (pos.node()->nodeType() == Node::TEXT_NODE || pos.node()->nodeType() == Node::CDATA_SECTION_NODE)) {
6220 selection.moveTo(pos);
6221 selection.expandUsingGranularity(Selection::WORD);
6225 if (selection.state() != Selection::CARET) {
6226 d->editor_context.beginSelectingText(Selection::WORD);
6229 setCaret(selection);
6235 QMouseEvent *mouse =
event->qmouseEvent();
6236 DOM::Node innerNode =
event->innerNode();
6240 if (mouse->button() == Qt::LeftButton && !innerNode.
isNull() && innerNode.
handle()->renderer() &&
6241 innerNode.
handle()->renderer()->shouldSelect()) {
6242 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6243 if (pos.node() && (pos.node()->nodeType() == Node::TEXT_NODE || pos.node()->nodeType() == Node::CDATA_SECTION_NODE)) {
6244 selection.moveTo(pos);
6245 selection.expandUsingGranularity(Selection::LINE);
6249 if (selection.state() != Selection::CARET) {
6250 d->editor_context.beginSelectingText(Selection::LINE);
6253 setCaret(selection);
6259 QMouseEvent *mouse =
event->qmouseEvent();
6260 DOM::Node innerNode =
event->innerNode();
6262 if (mouse->button() == Qt::LeftButton) {
6265 if (!innerNode.
isNull() && innerNode.
handle()->renderer() &&
6266 innerNode.
handle()->renderer()->shouldSelect()) {
6267 bool extendSelection = mouse->modifiers() & Qt::ShiftModifier;
6274 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6276 pos = Position(innerNode.
handle(), innerNode.
handle()->caretMinOffset());
6277 kDebug(6050) <<
event->x() <<
event->y() << pos << endl;
6280 if (extendSelection && sel.notEmpty()) {
6281 sel.clearModifyBias();
6283 if (d->editor_context.m_selectionGranularity != Selection::CHARACTER) {
6284 sel.expandUsingGranularity(d->editor_context.m_selectionGranularity);
6286 d->editor_context.m_beganSelectingText =
true;
6289 d->editor_context.m_selectionGranularity = Selection::CHARACTER;
6301 QMouseEvent *_mouse =
event->qmouseEvent();
6302 DOM::Node innerNode =
event->innerNode();
6303 d->m_mousePressNode = innerNode;
6305 d->m_dragStartPos =
QPoint(event->
x(),
event->y());
6308 d->m_strSelectedURL =
event->url().string();
6309 d->m_strSelectedURLTarget =
event->target().string();
6312 d->m_strSelectedURL.clear();
6313 d->m_strSelectedURLTarget.clear();
6316 if ( _mouse->button() == Qt::LeftButton ||
6317 _mouse->button() == Qt::MidButton )
6319 d->m_bMousePressed =
true;
6321 #ifdef KHTML_NO_SELECTION
6322 d->m_dragLastPos = _mouse->globalPos();
6324 if ( _mouse->button() == Qt::LeftButton )
6326 if ( (!d->m_strSelectedURL.isNull() && !
isEditable())
6327 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) )
6330 d->editor_context.m_beganSelectingText =
false;
6332 handleMousePressEventSingleClick(event);
6337 if ( _mouse->button() == Qt::RightButton )
6346 QMouseEvent *_mouse =
event->qmouseEvent();
6347 if ( _mouse->button() == Qt::LeftButton )
6349 d->m_bMousePressed =
true;
6350 d->editor_context.m_beganSelectingText =
false;
6353 handleMousePressEventDoubleClick(event);
6358 handleMousePressEventTripleClick(event);
6364 #ifndef KHTML_NO_SELECTION
6365 bool KHTMLPart::isExtendingSelection()
const
6370 return d->editor_context.m_beganSelectingText;
6373 void KHTMLPart::extendSelectionTo(
int x,
int y,
const DOM::Node &innerNode)
6376 Position pos(innerNode.
handle()->positionForCoordinates(x, y).position());
6384 Selection sel = caret();
6385 sel.clearModifyBias();
6386 if (!d->editor_context.m_beganSelectingText) {
6389 d->editor_context.beginSelectingText(Selection::CHARACTER);
6394 if (d->editor_context.m_selectionGranularity != Selection::CHARACTER) {
6395 sel.expandUsingGranularity(d->editor_context.m_selectionGranularity);
6400 #endif // KHTML_NO_SELECTION
6404 #ifdef QT_NO_DRAGANDDROP
6410 DOM::Node innerNode =
event->innerNode();
6412 if( (d->m_bMousePressed &&
6413 ( (!d->m_strSelectedURL.isEmpty() && !
isEditable())
6414 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) ) )
6420 HTMLImageElementImpl *img = 0L;
6429 img =
static_cast<HTMLImageElementImpl *
>(innerNode.
handle());
6430 u =
KUrl(
completeURL( khtml::parseURL(img->getAttribute(ATTR_SRC)).
string() ) );
6442 QDrag *drag =
new QDrag( d->m_view->viewport() );
6444 if ( !d->m_referrer.isEmpty() )
6445 metaDataMap.insert(
"referrer", d->m_referrer );
6446 QMimeData* mimeData =
new QMimeData();
6448 drag->setMimeData( mimeData );
6450 if( img && img->complete() )
6451 drag->mimeData()->setImageData( img->currentImage() );
6453 if ( !pix.isNull() )
6454 drag->setPixmap( pix );
6460 d->m_bMousePressed =
false;
6461 d->m_strSelectedURL.clear();
6462 d->m_strSelectedURLTarget.clear();
6466 #endif // QT_NO_DRAGANDDROP
6472 if ( d->m_bMousePressed )
return false;
6480 QMouseEvent *_mouse =
event->qmouseEvent();
6481 DOM::Node innerNode =
event->innerNode();
6483 bool shiftPressed = ( _mouse->modifiers() & Qt::ShiftModifier );
6488 HTMLImageElementImpl *i =
static_cast<HTMLImageElementImpl *
>(innerNode.
handle());
6489 if ( i && i->isServerMap() )
6491 khtml::RenderObject *r = i->renderer();
6495 r->absolutePosition(absx, absy);
6496 int x(event->
x() - absx), y(event->
y() - absy);
6498 d->m_overURL = url.
string() +
QString(
"?%1,%2").arg(x).arg(y);
6499 d->m_overURLTarget = target.
string();
6500 overURL( d->m_overURL, target.
string(), shiftPressed );
6507 if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
6509 d->m_overURL = url.
string();
6510 d->m_overURLTarget = target.
string();
6511 overURL( d->m_overURL, target.
string(), shiftPressed );
6516 if( !d->m_overURL.isEmpty() )
6528 if (!d->m_bMousePressed)
6531 #ifdef KHTML_NO_SELECTION
6532 if (d->m_doc && d->m_view) {
6533 QPoint diff( mouse->globalPos() - d->m_dragLastPos );
6535 if (abs(diff.x()) > 64 || abs(diff.y()) > 64) {
6536 d->m_view->scrollBy(-diff.x(), -diff.y());
6537 d->m_dragLastPos = mouse->globalPos();
6542 QMouseEvent *mouse =
event->qmouseEvent();
6543 DOM::Node innerNode =
event->innerNode();
6545 if ( (mouse->buttons() & Qt::LeftButton) == 0 || !innerNode.
handle() || !innerNode.
handle()->renderer() ||
6546 !innerNode.
handle()->renderer()->shouldSelect())
6550 extendSelectionTo(event->
x(),
event->y(), innerNode);
6551 #endif // KHTML_NO_SELECTION
6556 if (handleMouseMoveEventDrag(event))
6559 if (handleMouseMoveEventOver(event))
6562 handleMouseMoveEventSelection(event);
6567 DOM::Node innerNode =
event->innerNode();
6570 if ( d->m_bMousePressed ) {
6571 setStatusBarText(
QString(), BarHoverText);
6577 d->m_bMousePressed =
false;
6579 #ifndef QT_NO_CLIPBOARD
6580 QMouseEvent *_mouse =
event->qmouseEvent();
6582 kDebug( 6050 ) <<
"MMB shouldOpen=" << d->m_bOpenMiddleClick;
6584 if (d->m_bOpenMiddleClick) {
6592 #ifndef KHTML_NO_SELECTION
6598 if (!d->editor_context.m_beganSelectingText
6599 && d->m_dragStartPos.x() ==
event->x()
6600 && d->m_dragStartPos.y() ==
event->y()
6601 && d->editor_context.m_selection.state() == Selection::RANGE) {
6603 #ifdef APPLE_CHANGES
6604 if (d->editor_context.m_selection.base().node()->isContentEditable())
6606 selection.moveTo(d->editor_context.m_selection.base().node()->positionForCoordinates(event->
x(),
event->y()).position());
6607 setCaret(selection);
6610 #ifndef QT_NO_CLIPBOARD
6612 text.replace(QChar(0xa0),
' ');
6613 if (!text.isEmpty()) {
6614 disconnect( qApp->clipboard(), SIGNAL(
selectionChanged()),
this, SLOT(slotClearSelection()));
6615 qApp->clipboard()->setText(text,QClipboard::Selection);
6616 connect( qApp->clipboard(), SIGNAL(
selectionChanged()), SLOT(slotClearSelection()));
6620 emitSelectionChanged();
6634 emitSelectionChanged();
6635 emit d->m_extension->enableAction(
"print", d->m_doc != 0 );
6637 if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
6640 lst.append( d->m_paLoadImages );
6646 void KHTMLPart::slotPrintFrame()
6648 if ( d->m_frames.count() == 0 )
6661 const QMetaObject *mo = ext->metaObject();
6664 if (mo->indexOfSlot(
"print()") != -1)
6665 QMetaObject::invokeMethod(ext,
"print()", Qt::DirectConnection);
6668 void KHTMLPart::slotSelectAll()
6671 if (part && part->inherits(
"KHTMLPart"))
6672 static_cast<KHTMLPart *>(part)->selectAll();
6675 void KHTMLPart::startAutoScroll()
6677 connect(&d->m_scrollTimer, SIGNAL(
timeout()),
this, SLOT(slotAutoScroll()));
6678 d->m_scrollTimer.setSingleShot(
false);
6679 d->m_scrollTimer.start(100);
6682 void KHTMLPart::stopAutoScroll()
6684 disconnect(&d->m_scrollTimer, SIGNAL(
timeout()),
this, SLOT(slotAutoScroll()));
6685 if (d->m_scrollTimer.isActive())
6686 d->m_scrollTimer.stop();
6690 void KHTMLPart::slotAutoScroll()
6693 d->m_view->doAutoScroll();
6698 void KHTMLPart::runAdFilter()
6706 QSetIterator<khtml::CachedObject*> it( d->m_doc->docLoader()->m_docObjects );
6707 while (it.hasNext())
6709 khtml::CachedObject* obj = it.next();
6710 if ( obj->type() == khtml::CachedObject::Image ) {
6711 khtml::CachedImage *image =
static_cast<khtml::CachedImage *
>(obj);
6712 bool wasBlocked = image->m_wasBlocked;
6714 if ( image->m_wasBlocked != wasBlocked )
6715 image->do_notify(
QRect(
QPoint(0,0), image->pixmap_size()));
6720 for ( NodeImpl *nextNode, *node = d->m_doc; node; node = nextNode ) {
6723 nextNode = node->traverseNextNode();
6725 if ( node->id() == ID_IMG ||
6726 node->id() == ID_IFRAME ||
6727 (node->id() == ID_INPUT &&
static_cast<HTMLInputElementImpl *
>(node)->inputType() == HTMLInputElementImpl::IMAGE ))
6733 while (nextNode && nextNode->isAncestor(node))
6734 nextNode = nextNode->traverseNextNode();
6737 NodeImpl *parent = node->parent();
6741 parent->removeChild(node, exception);
6752 if (!d->m_doc)
return;
6755 if (d->m_doc->isHTMLDocument())
6756 first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6763 while ( first && !(first->renderer()
6764 && ((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE)
6765 || (first->renderer()->isReplaced() && !first->renderer()->firstChild()))))
6767 next = first->firstChild();
6768 if ( !next ) next = first->nextSibling();
6769 while( first && !next )
6771 first = first->parentNode();
6773 next = first->nextSibling();
6779 if (d->m_doc->isHTMLDocument())
6780 last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6787 while ( last && !(last->renderer()
6788 && ((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE)
6789 || (last->renderer()->isReplaced() && !last->renderer()->lastChild()))))
6791 next = last->lastChild();
6792 if ( !next ) next = last->previousSibling();
6793 while ( last && !next )
6795 last = last->parentNode();
6797 next = last->previousSibling();
6802 if ( !first || !last )
6804 Q_ASSERT(first->renderer());
6805 Q_ASSERT(last->renderer());
6806 d->editor_context.m_selection.moveTo(Position(first, 0), Position(last, last->nodeValue().length()));
6807 d->m_doc->updateSelection();
6809 emitSelectionChanged();
6814 bool linkAllowed =
true;
6817 linkAllowed = KAuthorized::authorizeUrlAction(
"redirect",
url(), linkURL);
6819 if ( !linkAllowed ) {
6820 khtml::Tokenizer *tokenizer = d->m_doc->tokenizer();
6822 tokenizer->setOnHold(
true);
6830 i18n(
"Security Warning" ),
6832 KStandardGuiItem::cancel(),
6839 i18n(
"<qt>Access by untrusted page to<br /><b>%1</b><br /> denied.</qt>", Qt::escape(linkURL.
prettyUrl())),
6840 i18n(
"Security Alert" ));
6844 tokenizer->setOnHold(
false);
6853 if ( part == d->m_activeFrame )
6855 d->m_activeFrame = 0L;
6856 if ( !part->inherits(
"KHTMLPart" ) )
6868 void KHTMLPart::slotActiveFrameChanged(
KParts::Part *part )
6873 kError(6050) <<
"strange error! we activated ourselves";
6878 if ( d->m_activeFrame && d->m_activeFrame->widget() && 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::Sunken);
6888 if( d->m_activeFrame && !d->m_activeFrame->inherits(
"KHTMLPart" ) )
6895 if( part && !part->inherits(
"KHTMLPart" ) )
6904 d->m_activeFrame = part;
6906 if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits(
"QFrame" ) )
6908 QFrame *frame =
static_cast<QFrame *
>( d->m_activeFrame->widget() );
6909 if (frame->frameStyle() != QFrame::NoFrame)
6911 frame->setFrameStyle( QFrame::StyledPanel | QFrame::Plain);
6914 kDebug(6050) <<
"new active frame " << d->m_activeFrame;
6925 if (!d->m_doc || !d->m_view)
6929 d->m_doc->setFocusNode(node.
handle());
6933 d->m_view->ensureVisible(rect.right(), rect.bottom());
6934 d->m_view->ensureVisible(rect.left(), rect.top());
6939 return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
6949 return proxy->createHTMLEventHandler(
url().
url(), name, code, node, svg );
6957 void KHTMLPart::setOpener(
KHTMLPart *_opener)
6959 d->m_opener = _opener;
6962 bool KHTMLPart::openedByJS()
6964 return d->m_openedByJS;
6967 void KHTMLPart::setOpenedByJS(
bool _openedByJS)
6969 d->m_openedByJS = _openedByJS;
6974 khtml::Cache::preloadStyleSheet(url, stylesheet);
6979 khtml::Cache::preloadScript(url, script);
6982 long KHTMLPart::cacheId()
const
6984 return d->m_cacheId;
6989 return d->m_restored;
6999 return d->m_pluginPageQuestionAsked.contains(mimetype);
7007 d->m_pluginPageQuestionAsked.append(mimetype);
7013 if( !d->m_encoding.isNull() )
7014 dec->
setEncoding( d->m_encoding.toLatin1().constData(),
7024 d->m_doc->setDecoder(dec);
7029 void KHTMLPart::emitCaretPositionChanged(
const DOM::Position &pos) {
7031 Position rng_pos = pos.equivalentRangeCompliantPosition();
7032 Node node = rng_pos.node();
7036 void KHTMLPart::restoreScrollPosition()
7040 if (
url().hasRef() && !d->m_restoreScrollPosition && !args.
reload()) {
7041 if ( !d->m_doc || !d->m_doc->parsing() )
7042 disconnect(d->m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
7052 if (d->m_view->contentsHeight() - d->m_view->visibleHeight() >= args.
yOffset()
7053 || d->m_bComplete) {
7055 disconnect(d->m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
7060 void KHTMLPart::openWallet(DOM::HTMLFormElementImpl *form)
7062 #ifndef KHTML_NO_WALLET
7069 p->openWallet(form);
7078 if (d->m_bWalletOpened) {
7079 if (d->m_wallet->isOpen()) {
7080 form->walletOpened(d->m_wallet);
7083 d->m_wallet->deleteLater();
7085 d->m_bWalletOpened =
false;
7092 d->m_wq->wallet = wallet;
7093 connect(wallet, SIGNAL(walletOpened(
bool)), d->m_wq, SLOT(walletOpened(
bool)));
7098 #endif // KHTML_NO_WALLET
7104 #ifndef KHTML_NO_WALLET
7111 p->saveToWallet(key, data);
7116 if (d->m_bWalletOpened) {
7117 if (d->m_wallet->isOpen()) {
7122 d->m_wallet->writeMap(key, data);
7125 d->m_wallet->deleteLater();
7127 d->m_bWalletOpened =
false;
7134 d->m_wq->wallet = wallet;
7135 connect(wallet, SIGNAL(walletOpened(
bool)), d->m_wq, SLOT(walletOpened(
bool)));
7138 d->m_wq->savers.append(qMakePair(key, data));
7139 #endif // KHTML_NO_WALLET
7143 void KHTMLPart::dequeueWallet(DOM::HTMLFormElementImpl *form) {
7144 #ifndef KHTML_NO_WALLET
7151 p->dequeueWallet(form);
7158 #endif // KHTML_NO_WALLET
7163 #ifndef KHTML_NO_WALLET
7167 d->m_wq->deleteLater();
7171 d->m_bWalletOpened =
false;
7175 d->m_wallet = wallet;
7176 d->m_bWalletOpened =
true;
7177 connect(d->m_wallet, SIGNAL(walletClosed()), SLOT(slotWalletClosed()));
7178 d->m_walletForms.clear();
7179 if (!d->m_statusBarWalletLabel) {
7180 d->m_statusBarWalletLabel =
new KUrlLabel(d->m_statusBarExtension->statusBar());
7181 d->m_statusBarWalletLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum));
7183 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarWalletLabel, 0,
false);
7184 d->m_statusBarWalletLabel->setPixmap(
SmallIcon(
"wallet-open"));
7185 connect(d->m_statusBarWalletLabel, SIGNAL(leftClickedUrl()), SLOT(launchWalletManager()));
7186 connect(d->m_statusBarWalletLabel, SIGNAL(rightClickedUrl()), SLOT(walletMenu()));
7189 #endif // KHTML_NO_WALLET
7195 #ifndef KHTML_NO_WALLET
7207 #endif // !KHTML_NO_WALLET
7211 void KHTMLPart::slotWalletClosed()
7213 #ifndef KHTML_NO_WALLET
7215 d->m_wallet->deleteLater();
7218 d->m_bWalletOpened =
false;
7219 if (d->m_statusBarWalletLabel) {
7220 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarWalletLabel);
7221 delete d->m_statusBarWalletLabel;
7222 d->m_statusBarWalletLabel = 0L;
7224 #endif // KHTML_NO_WALLET
7227 void KHTMLPart::launchWalletManager()
7229 #ifndef KHTML_NO_WALLET
7230 QDBusInterface r(
"org.kde.kwalletmanager",
"/kwalletmanager/MainWindow_1",
7231 "org.kde.KMainWindow");
7235 r.call(QDBus::NoBlock,
"show");
7236 r.call(QDBus::NoBlock,
"raise");
7238 #endif // KHTML_NO_WALLET
7241 void KHTMLPart::walletMenu()
7243 #ifndef KHTML_NO_WALLET
7245 QActionGroup *menuActionGroup =
new QActionGroup(menu);
7246 connect( menuActionGroup, SIGNAL(triggered(
QAction*)),
this, SLOT(removeStoredPasswordForm(
QAction*)) );
7248 menu->addAction(
i18n(
"&Close Wallet"),
this, SLOT(slotWalletClosed()));
7250 if (d->m_view && d->m_view->nonPasswordStorableSite(
toplevelURL().host())) {
7251 menu->addAction(
i18n(
"&Allow storing passwords for this site"),
this, SLOT(delNonPasswordStorableSite()));
7255 for ( QStringList::ConstIterator it = d->m_walletForms.constBegin(); it != d->m_walletForms.constEnd(); ++it ) {
7256 QAction* action = menu->addAction(
i18n(
"Remove password for form %1", *it) );
7257 action->setActionGroup(menuActionGroup);
7259 action->setData(var);
7263 menu->popup(QCursor::pos());
7264 #endif // KHTML_NO_WALLET
7267 void KHTMLPart::removeStoredPasswordForm(
QAction* action)
7269 #ifndef KHTML_NO_WALLET
7288 if (d->m_wallet->removeEntry(key))
7291 d->m_walletForms.removeAll(key);
7292 #endif // KHTML_NO_WALLET
7295 void KHTMLPart::addWalletFormKey(
const QString& walletFormKey)
7297 #ifndef KHTML_NO_WALLET
7300 parentPart()->addWalletFormKey(walletFormKey);
7304 if(!d->m_walletForms.contains(walletFormKey))
7305 d->m_walletForms.append(walletFormKey);
7306 #endif // KHTML_NO_WALLET
7309 void KHTMLPart::delNonPasswordStorableSite()
7311 #ifndef KHTML_NO_WALLET
7313 d->m_view->delNonPasswordStorableSite(
toplevelURL().host());
7314 #endif // KHTML_NO_WALLET
7318 #ifndef KHTML_NO_WALLET
7319 d->m_storePass.saveLoginInformation(host, key, walletMap);
7320 #endif // KHTML_NO_WALLET
7323 void KHTMLPart::slotToggleCaretMode()
7329 d->m_formNotification = fn;
7333 return d->m_formNotification;
7353 return d->m_doc->unsubmittedFormChanges();
7356 void KHTMLPart::setDebugScript(
bool enable )
7360 if (!d->m_paDebugScript) {
7361 d->m_paDebugScript =
new KAction(
i18n(
"JavaScript &Debugger" ),
this );
7363 connect( d->m_paDebugScript, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugScript()) );
7365 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
7367 lst.append( d->m_paDebugScript );
7370 d->m_bJScriptDebugEnabled = enable;
7380 if ( enable && originPart ) {
7381 d->m_openableSuppressedPopups++;
7382 if ( d->m_suppressedPopupOriginParts.indexOf( originPart ) == -1 )
7383 d->m_suppressedPopupOriginParts.append( originPart );
7386 if ( enable && !d->m_statusBarPopupLabel ) {
7387 d->m_statusBarPopupLabel =
new KUrlLabel( d->m_statusBarExtension->statusBar() );
7388 d->m_statusBarPopupLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum ));
7390 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarPopupLabel, 0,
false );
7391 d->m_statusBarPopupLabel->setPixmap(
SmallIcon(
"window-suppressed") );
7393 d->m_statusBarPopupLabel->setToolTip(
i18n(
"This page was prevented from opening a new window via JavaScript." ) );
7395 connect(d->m_statusBarPopupLabel, SIGNAL(leftClickedUrl()), SLOT(suppressedPopupMenu()));
7396 if (d->m_settings->jsPopupBlockerPassivePopup()) {
7399 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);
7401 }
else if ( !enable && d->m_statusBarPopupLabel ) {
7402 d->m_statusBarPopupLabel->setToolTip(
"" );
7403 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarPopupLabel );
7404 delete d->m_statusBarPopupLabel;
7405 d->m_statusBarPopupLabel = 0L;
7409 void KHTMLPart::suppressedPopupMenu() {
7411 if ( d->m_openableSuppressedPopups )
7412 m->addAction(
i18np(
"&Show Blocked Popup Window",
"&Show %1 Blocked Popup Windows", d->m_openableSuppressedPopups),
this, SLOT(showSuppressedPopups()));
7413 QAction *a = m->addAction(
i18n(
"Show Blocked Window Passive Popup &Notification"),
this, SLOT(togglePopupPassivePopup()));
7414 a->setChecked(d->m_settings->jsPopupBlockerPassivePopup());
7415 m->addAction(
i18n(
"&Configure JavaScript New Window Policies..."),
this, SLOT(launchJSConfigDialog()));
7416 m->popup(QCursor::pos());
7419 void KHTMLPart::togglePopupPassivePopup() {
7421 d->m_settings->setJSPopupBlockerPassivePopup( !d->m_settings->jsPopupBlockerPassivePopup() );
7425 void KHTMLPart::showSuppressedPopups() {
7426 foreach (
KHTMLPart* part, d->m_suppressedPopupOriginParts ) {
7428 KJS::Window *w = KJS::Window::retrieveWindow( part );
7430 w->showSuppressedWindows();
7431 w->forgetSuppressedWindows();
7436 d->m_openableSuppressedPopups = 0;
7437 d->m_suppressedPopupOriginParts.clear();
7442 QString KHTMLPart::defaultExtension()
const
7446 if ( !d->m_doc->isHTMLDocument() )
7448 return d->m_doc->htmlMode() == DOM::DocumentImpl::XHtml ?
".xhtml" :
".html";
7453 if (!d->m_bComplete || d->m_runningScripts || (d->m_doc && d->m_doc->parsing()))
7459 for (; it !=
end; ++it ) {
7460 if ((*it)->m_run || !(*it)->m_bCompleted)
7464 return d->m_submitForm || !d->m_redirectURL.isEmpty() || d->m_redirectionTimer.isActive() || d->m_job;
7467 using namespace KParts;
7468 #include "khtml_part.moc"
7469 #include "khtmlpart_p.moc"
7470 #ifndef KHTML_NO_WALLET
7471 #include "khtml_wallet_p.moc"