33 #include "ui_htmlpageinfo.h"
44 #include "html/html_documentimpl.h"
45 #include "html/html_baseimpl.h"
46 #include "html/html_objectimpl.h"
47 #include "html/html_miscimpl.h"
48 #include "html/html_imageimpl.h"
49 #include "imload/imagemanager.h"
50 #include "rendering/render_text.h"
51 #include "rendering/render_frames.h"
52 #include "rendering/render_layer.h"
53 #include "rendering/render_position.h"
54 #include "misc/loader.h"
55 #include "misc/khtml_partaccessor.h"
56 #include "xml/dom2_eventsimpl.h"
57 #include "xml/dom2_rangeimpl.h"
58 #include "xml/xml_tokenizer.h"
59 #include "css/cssstyleselector.h"
60 #include "css/csshelper.h"
67 #include "ecma/kjs_proxy.h"
68 #include "ecma/kjs_window.h"
69 #include "ecma/kjs_events.h"
73 #include <kjs/function.h>
74 #include <kjs/interpreter.h>
76 #include <sys/types.h>
106 #include <kde_file.h>
120 #include <QtGui/QClipboard>
121 #include <QtGui/QToolTip>
122 #include <QtCore/QFile>
123 #include <QtCore/QMetaEnum>
124 #include <QtGui/QTextDocument>
125 #include <QtCore/QDate>
126 #include <QtNetwork/QSslCertificate>
132 #include "rendering/render_form.h"
136 #include "ecma/debugger/debugwindow.h"
152 class PartStyleSheetLoader :
public CachedObjectClient
158 m_cachedSheet = dl->requestStyleSheet(url,
QString(),
"text/css",
161 m_cachedSheet->ref(
this );
163 virtual ~PartStyleSheetLoader()
165 if ( m_cachedSheet ) m_cachedSheet->deref(
this);
174 virtual void error(
int,
const QString& ) {
177 QPointer<KHTMLPart> m_part;
178 khtml::CachedCSSStyleSheet *m_cachedSheet;
188 init(
new KHTMLView(
this, parentWidget ), prof );
199 view->setPart(
this );
203 void KHTMLPart::init(
KHTMLView *view, GUIProfile prof )
216 widget->setObjectName(
"khtml_part_widget");
217 QVBoxLayout *layout =
new QVBoxLayout( widget );
218 layout->setContentsMargins( 0, 0, 0, 0 );
219 layout->setSpacing( 0 );
220 widget->setLayout( layout );
226 layout->addWidget( d->
m_view );
229 widget->setFocusProxy( d->
m_view );
236 d->
m_extension->setObjectName(
"KHTMLBrowserExtension" );
254 connect( d->
m_paViewDocument, SIGNAL(triggered(
bool)),
this, SLOT(slotViewDocumentSource()) );
261 connect( d->
m_paViewFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotViewFrameSource()) );
271 connect( d->
m_paViewInfo, SIGNAL(triggered(
bool)),
this, SLOT(slotViewPageInfo()) );
275 connect( d->
m_paSaveBackground, SIGNAL(triggered(
bool)),
this, SLOT(slotSaveBackground()) );
278 this, SLOT(slotSaveDocument()) );
284 connect( d->
m_paSaveFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotSaveFrame()) );
296 connect( d->
m_paSecurity, SIGNAL(triggered(
bool)),
this, SLOT(slotSecurity()) );
300 connect( d->
m_paDebugRenderTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugRenderTree()) );
304 connect( d->
m_paDebugDOMTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugDOMTree()) );
306 KAction* paDebugFrameTree =
new KAction(
i18n(
"Print frame tree to STDOUT" ),
this );
308 connect( paDebugFrameTree, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugFrameTree()) );
312 connect( d->
m_paStopAnimations, SIGNAL(triggered(
bool)),
this, SLOT(slotStopAnimations()) );
321 if ( KGlobal::config()->hasGroup(
"HTML Settings" ) ) {
326 const QByteArray
name = KGlobal::locale()->encoding().toLower();
328 if (name.endsWith(
"1251")||name.startsWith(
"koi")||name==
"iso-8859-5")
330 else if (name.endsWith(
"1256")||name==
"iso-8859-6")
332 else if (name.endsWith(
"1257")||name==
"iso-8859-13"||name==
"iso-8859-4")
334 else if (name.endsWith(
"1250")|| name==
"ibm852" || name==
"iso-8859-2" || name==
"iso-8859-3" )
336 else if (name.endsWith(
"1253")|| name==
"iso-8859-7" )
338 else if (name.endsWith(
"1255")|| name==
"iso-8859-8" || name==
"iso-8859-8-i" )
340 else if (name==
"jis7" || name==
"eucjp" || name==
"sjis" )
342 else if (name.endsWith(
"1254")|| name==
"iso-8859-9" )
344 else if (name.endsWith(
"1252")|| name==
"iso-8859-1" || name==
"iso-8859-15" )
355 connect( d->
m_paUseStylesheet, SIGNAL(triggered(
int)),
this, SLOT(slotUseStylesheet()) );
360 connect(d->
m_paIncZoomFactor, SIGNAL(triggered(
bool)), SLOT(slotIncFontSizeFast()));
362 "Make the font in this window bigger. "
363 "Click and hold down the mouse button for a menu with all available font sizes.</qt>" ) );
367 connect(d->
m_paDecZoomFactor, SIGNAL(triggered(
bool)), SLOT(slotDecFontSizeFast()));
369 "Make the font in this window smaller. "
370 "Click and hold down the mouse button for a menu with all available font sizes.</qt>" ) );
383 d->
m_paFind->setWhatsThis(
i18n(
"<qt>Find text<br /><br />"
384 "Shows a dialog that allows you to find text on the displayed page.</qt>" ) );
388 "Find the next occurrence of the text that you "
389 "have found using the <b>Find Text</b> function.</qt>" ) );
392 this, SLOT(slotFindPrev()) );
394 "Find the previous occurrence of the text that you "
395 "have found using the <b>Find Text</b> function.</qt>" ) );
401 d->
m_paFindAheadText->
setHelpText(
i18n(
"This shortcut shows the find bar, for finding text in the displayed page. It cancels the effect of \"Find Links as You Type\", which sets the \"Find links only\" option."));
402 connect( d->
m_paFindAheadText, SIGNAL(triggered(
bool)),
this, SLOT(slotFindAheadText()) );
411 connect( d->
m_paFindAheadLinks, SIGNAL(triggered(
bool)),
this, SLOT(slotFindAheadLink()) );
425 connect( d->
m_paPrintFrame, SIGNAL(triggered(
bool)),
this, SLOT(slotPrintFrame()) );
427 "Some pages have several frames. To print only a single frame, click "
428 "on it and then use this function.</qt>" ) );
436 this, SLOT(slotSelectAll()) );
443 connect( d->
m_paToggleCaretMode, SIGNAL(triggered(
bool)),
this, SLOT(slotToggleCaretMode()) );
484 action->setShortcutContext ( Qt::WidgetWithChildrenShortcut );
488 connect( view, SIGNAL(zoomView(
int)), SLOT(slotZoomView(
int)) );
491 this, SLOT(updateActions()) );
493 this, SLOT(updateActions()) );
495 this, SLOT(updateActions()) );
500 connect( khtml::Cache::loader(), SIGNAL(requestStarted(khtml::DocLoader*,khtml::CachedObject*)),
501 this, SLOT(slotLoaderRequestStarted(khtml::DocLoader*,khtml::CachedObject*)) );
502 connect( khtml::Cache::loader(), SIGNAL(requestDone(khtml::DocLoader*,khtml::CachedObject*)),
503 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
504 connect( khtml::Cache::loader(), SIGNAL(requestFailed(khtml::DocLoader*,khtml::CachedObject*)),
505 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
512 this, SLOT(slotRedirect()) );
514 if (QDBusConnection::sessionBus().isConnected()) {
516 for (
int i = 1; ; ++i)
517 if (QDBusConnection::sessionBus().registerObject(
QString(
"/KHTML/%1/widget").arg(i),
this))
519 else if (i == 0xffff)
520 kFatal() <<
"Something is very wrong in KHTMLPart!";
530 KGlobal::locale()->removeCatalog(
"khtml");
545 removeJSErrorExtension();
554 disconnect( khtml::Cache::loader(), SIGNAL(requestStarted(khtml::DocLoader*,khtml::CachedObject*)),
555 this, SLOT(slotLoaderRequestStarted(khtml::DocLoader*,khtml::CachedObject*)) );
556 disconnect( khtml::Cache::loader(), SIGNAL(requestDone(khtml::DocLoader*,khtml::CachedObject*)),
557 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
558 disconnect( khtml::Cache::loader(), SIGNAL(requestFailed(khtml::DocLoader*,khtml::CachedObject*)),
559 this, SLOT(slotLoaderRequestDone(khtml::DocLoader*,khtml::CachedObject*)) );
577 d->
m_frame->m_run.data()->abort();
582 bool KHTMLPart::restoreURL(
const KUrl &url )
611 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
612 connect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
625 if (url.
protocol() == QLatin1String(
"help"))
640 if ((oldRef != newRef) || (oldRef.isNull() && newRef.isEmpty())) {
641 DOM::HashChangeEventImpl *evImpl =
new DOM::HashChangeEventImpl();
642 evImpl->initHashChangeEvent(
"hashchange",
648 m_doc->dispatchWindowEvent(evImpl);
660 kDebug( 6050 ) <<
this <<
"opening" <<
url;
688 if ( !urls.isEmpty() ) {
689 const KUrl mainURL = urls.first();
690 int error = mainURL.
queryItem(
"error" ).toInt();
692 if ( error == 0 ) error = KIO::ERR_UNKNOWN;
709 d->
m_statusBarUALabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum));
733 bool isFrameSet =
false;
734 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
735 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
736 isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
743 for (; it !=
end; ++it) {
758 if ( url.
hasRef() && !isFrameSet )
760 bool noReloadForced = !args.reload() && !browserArgs.redirectedRequest() && !browserArgs.doPost();
763 kDebug( 6050 ) <<
"jumping to anchor. m_url = " <<
url;
772 d->
m_doc->setParsing(
false);
774 kDebug( 6050 ) <<
"completed...";
783 args.setXOffset( d->
m_view->contentsX() );
784 args.setYOffset( d->
m_view->contentsY() );
792 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
793 connect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
804 begin(url, args.xOffset(), args.yOffset());
805 write(QString::fromLatin1(
"<html><head></head><body>"));
807 write(QString::fromLatin1(
"<img "));
809 write(QString::fromLatin1(
"<embed "));
810 write(QString::fromLatin1(
"src=\""));
815 write(QString::fromLatin1(
"\">"));
824 if(url.
protocol().startsWith(
"http" ) && !url.host().isEmpty() &&
825 url.
path().isEmpty()) {
832 metaData.insert(
"main_frame_request",
parentPart() == 0 ?
"TRUE" :
"FALSE" );
835 metaData.insert(
"PropagateHttpHeader",
"true");
836 metaData.insert(
"ssl_was_in_use", d->
m_ssl_in_use ?
"TRUE" :
"FALSE" );
837 metaData.insert(
"ssl_activate_warnings",
"TRUE" );
845 else if (args.reload() && !browserArgs.softReload)
850 if ( browserArgs.doPost() && (url.
protocol().startsWith(
"http")) )
852 d->
m_job = KIO::http_post( url, browserArgs.postData, KIO::HideProgressInfo );
853 d->
m_job->addMetaData(
"content-type", browserArgs.contentType() );
857 d->
m_job = KIO::get( url, KIO::NoReload, KIO::HideProgressInfo );
862 d->
m_job->ui()->setWindow(
widget()->topLevelWidget());
863 d->
m_job->addMetaData(metaData);
865 connect( d->
m_job, SIGNAL(result(
KJob*)),
868 SLOT(slotData(
KIO::Job*,QByteArray)) );
890 connect( d->
m_job, SIGNAL(speed(
KJob*,ulong)),
891 this, SLOT(slotJobSpeed(
KJob*,ulong)) );
893 connect( d->
m_job, SIGNAL(percent(
KJob*,ulong)),
894 this, SLOT(slotJobPercent(
KJob*,ulong)) );
896 connect( d->
m_job, SIGNAL(result(
KJob*)),
897 this, SLOT(slotJobDone(
KJob*)) );
905 KIO::StatJob *job = KIO::stat( url, KIO::HideProgressInfo );
906 connect( job, SIGNAL(result(
KJob*)),
907 this, SLOT(slotUserSheetStatDone(
KJob*)) );
924 if ( d->
m_doc && d->
m_doc->isHTMLDocument() ) {
925 HTMLDocumentImpl* hdoc =
static_cast<HTMLDocumentImpl*
>( d->
m_doc );
928 hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT,
false,
false );
930 d->
m_doc->updateRendering();
939 disconnect(d->
m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
944 kDebug( 6050 ) <<
" was still parsing... calling end ";
945 slotFinishedParsing();
946 d->
m_doc->setParsing(
false);
952 kDebug( 6050 ) <<
"Aborted before starting to render, reverting location bar to " <<
url().
prettyUrl();
959 khtml::Cache::loader()->cancelRequests( d->
m_doc->docLoader() );
965 for (; it !=
end; ++it )
968 (*it)->m_run.data()->abort();
969 if ( !( *it )->m_part.isNull() )
970 ( *it )->m_part.data()->closeUrl();
977 for (; it !=
end; ++it)
979 if ( !( *it )->m_part.isNull() )
980 ( *it )->m_part.data()->closeUrl();
992 d->
m_view->closeChildDialogs();
1000 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
1002 return static_cast<HTMLDocumentImpl*
>(0);
1015 QByteArray sourceArray;
1016 QDataStream dataStream( &sourceArray, QIODevice::WriteOnly );
1018 QTextStream stream( sourceArray, QIODevice::ReadOnly );
1019 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1020 sourceStr = stream.readAll();
1027 if ( f.open( QIODevice::ReadOnly ) )
1029 QTextStream stream( &f );
1030 stream.setCodec( QTextCodec::codecForName(
encoding().toLatin1().constData() ) );
1031 sourceStr = stream.readAll();
1059 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1066 if (const_cast<KHTMLPart*>(
this)->
parentPart())
1079 if (!proxy || proxy->paused())
1082 return proxy->interpreter();
1093 d->
m_frame->m_jscript->clear();
1131 KJSProxy *KHTMLPart::jScript()
1143 for (; it !=
end; ++it)
1144 if ((*it)->m_part.data() ==
this) {
1163 QString trg = target.toLower();
1165 if (target ==
"_top") {
1169 else if (target ==
"_parent") {
1173 else if (target ==
"_self" || target ==
"_blank") {
1183 if (destpart ==
this)
1187 if (destpart->checkFrameAccess(
this))
1220 d->
m_jsedlg->_clear->setIcon(
KIcon(
"edit-clear-locationbar-ltr"));
1227 void KHTMLPart::removeJSErrorExtension() {
1241 void KHTMLPart::disableJSErrorExtension() {
1242 removeJSErrorExtension();
1251 void KHTMLPart::jsErrorDialogContextMenu() {
1253 m->addAction(
i18n(
"&Hide Errors"),
this, SLOT(removeJSErrorExtension()));
1254 m->addAction(
i18n(
"&Disable Error Reporting"),
this, SLOT(disableJSErrorExtension()));
1255 m->popup(QCursor::pos());
1258 void KHTMLPart::launchJSErrorDialog() {
1266 void KHTMLPart::launchJSConfigDialog() {
1268 args <<
"khtml_java_js";
1276 kDebug(6070) <<
"executeScript: caller='" << objectName() <<
"' filename=" << filename <<
" baseLine=" << baseLine ;
1280 if (!proxy || proxy->paused())
1284 (void)proxy->interpreter();
1286 KJS::Completion comp;
1288 QVariant ret = proxy->evaluate(filename, baseLine, script, n, &comp);
1293 if (comp.complType() == KJS::Throw && comp.value()) {
1296 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1297 proxy->interpreter()->globalExec(), comp.value());
1299 Qt::escape(filename), Qt::escape(msg)));
1306 kDebug(6070) <<
"executeScript done, handling immediate redirection NOW";
1308 khtml::Tokenizer* t = d->
m_doc->tokenizer();
1330 if (!proxy || proxy->paused())
1332 (void)proxy->interpreter();
1335 KJS::Completion comp;
1336 const QVariant ret = proxy->evaluate(
QString(), 1, script, n, &comp );
1342 if (comp.complType() == KJS::Throw && comp.value()) {
1345 QString msg = KJSDebugger::DebugWindow::exceptionToString(
1346 proxy->interpreter()->globalExec(), comp.value());
1347 dlg->
addError(
i18n(
"<qt><b>Error</b>: node %1: %2</qt>",
1397 void KHTMLPart::slotDebugDOMTree()
1400 qDebug(
"%s", d->
m_doc->toString().string().toLatin1().constData());
1408 for (; it !=
end; ++it )
1409 if ( !( *it )->m_part.isNull() && (*it)->m_part.data()->inherits(
"KHTMLPart" ) ) {
1412 static_cast<KHTMLPart*
>( p )->slotDebugDOMTree();
1417 void KHTMLPart::slotDebugScript()
1420 jScript()->showDebugWindow();
1423 void KHTMLPart::slotDebugRenderTree()
1427 d->
m_doc->renderer()->printTree();
1438 void KHTMLPart::slotDebugFrameTree()
1443 void KHTMLPart::slotStopAnimations()
1450 if ( d->
m_doc && d->
m_doc->docLoader()->autoloadImages() == enable )
1454 d->
m_doc->docLoader()->setAutoloadImages( enable );
1466 connect( d->
m_paLoadImages, SIGNAL(triggered(
bool)),
this, SLOT(slotLoadImages()) );
1479 return d->
m_doc->docLoader()->autoloadImages();
1484 void KHTMLPart::clear()
1496 for(; it !=
end; ++it )
1500 (*it)->m_run.data()->abort();
1507 for(; it !=
end; ++it )
1511 (*it)->m_run.data()->abort();
1522 if (d->
m_doc->attached())
1528 d->
m_frame->m_jscript->clear();
1531 if (d->
m_doc && d->
m_doc->renderer() && d->
m_doc->renderer()->layer())
1532 d->
m_doc->renderer()->layer()->suspendMarquees();
1559 for(; it !=
end; ++it )
1561 if ( (*it)->m_part )
1564 delete (*it)->m_part.data();
1578 for (; oi != oiEnd; ++oi )
1580 delete (*oi)->m_part.data();
1602 #ifndef QT_NO_CLIPBOARD
1603 connect( qApp->clipboard(), SIGNAL(
selectionChanged()), SLOT(slotClearSelection()));
1631 DOM::HTMLDocumentImpl *KHTMLPart::docImpl()
const
1633 if ( d && d->
m_doc && d->
m_doc->isHTMLDocument() )
1634 return static_cast<HTMLDocumentImpl*>(d->
m_doc);
1638 DOM::DocumentImpl *KHTMLPart::xmlDocImpl()
const
1645 void KHTMLPart::slotInfoMessage(
KJob* kio_job,
const QString& msg)
1652 setStatusBarText(msg, BarDefaultText);
1660 void KHTMLPart::slotData(
KIO::Job* kio_job,
const QByteArray &data )
1685 d->
m_doc->docLoader()->setCachePolicy(KIO::CC_Verify);
1695 time_t cacheCreationDate = d->
m_job->queryMetaData(
"cache-creation-date").toLong();
1696 d->
m_doc->docLoader()->setCacheCreationDate(cacheCreationDate);
1731 qData = d->
m_job->queryMetaData(
"http-refresh");
1732 if( !qData.isEmpty())
1733 d->
m_doc->processHttpEquiv(
"refresh", qData);
1744 QString language = d->
m_job->queryMetaData(
"content-language");
1745 if (!language.isEmpty())
1746 d->
m_doc->setContentLanguage(language);
1748 if ( !
url().isLocalFile() )
1758 write( data.data(), data.size() );
1761 void KHTMLPart::slotRestoreData(
const QByteArray &data )
1777 write( data.data(), data.size() );
1779 if (data.size() == 0)
1793 if (job->error() == KIO::ERR_NO_CONTENT)
1797 job->uiDelegate()->showErrorMessage();
1807 kDebug(6050) <<
"errorCode" << errorCode <<
"text" << text;
1815 QString errorName, techName, description;
1818 QByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
1819 QDataStream stream(raw);
1821 stream >> errorName >> techName >> description >> causes >> solutions;
1827 url = Qt::escape( Qt::escape( reqUrl.
prettyUrl() ) );
1829 datetime = KGlobal::locale()->formatDateTime( QDateTime::currentDateTime(),
1833 QFile file( filename );
1834 bool isOpened = file.open( QIODevice::ReadOnly );
1836 kWarning(6050) <<
"Could not open error html template:" << filename;
1840 html.replace( QLatin1String(
"TITLE" ),
i18n(
"Error: %1 - %2", errorName, url ) );
1841 html.replace( QLatin1String(
"DIRECTION" ), QApplication::isRightToLeft() ?
"rtl" :
"ltr" );
1844 QString doc = QLatin1String(
"<h1>" );
1845 doc +=
i18n(
"The requested operation could not be completed" );
1846 doc += QLatin1String(
"</h1><h2>" );
1848 doc += QLatin1String(
"</h2>" );
1849 if ( !techName.isNull() ) {
1850 doc += QLatin1String(
"<h2>" );
1851 doc +=
i18n(
"Technical Reason: " );
1853 doc += QLatin1String(
"</h2>" );
1855 doc += QLatin1String(
"<br clear=\"all\">" );
1856 doc += QLatin1String(
"<h3>" );
1857 doc +=
i18n(
"Details of the Request:" );
1858 doc += QLatin1String(
"</h3><ul><li>" );
1859 doc +=
i18n(
"URL: %1" , url );
1860 doc += QLatin1String(
"</li><li>" );
1861 if ( !protocol.isNull() ) {
1862 doc +=
i18n(
"Protocol: %1", protocol );
1863 doc += QLatin1String(
"</li><li>" );
1865 doc +=
i18n(
"Date and Time: %1" , datetime );
1866 doc += QLatin1String(
"</li><li>" );
1867 doc +=
i18n(
"Additional Information: %1" , text );
1868 doc += QLatin1String(
"</li></ul><h3>" );
1869 doc +=
i18n(
"Description:" );
1870 doc += QLatin1String(
"</h3><p>" );
1872 doc += QLatin1String(
"</p>" );
1873 if ( causes.count() ) {
1874 doc += QLatin1String(
"<h3>" );
1875 doc +=
i18n(
"Possible Causes:" );
1876 doc += QLatin1String(
"</h3><ul><li>" );
1877 doc += causes.join(
"</li><li>" );
1878 doc += QLatin1String(
"</li></ul>" );
1880 if ( solutions.count() ) {
1881 doc += QLatin1String(
"<h3>" );
1882 doc +=
i18n(
"Possible Solutions:" );
1883 doc += QLatin1String(
"</h3><ul><li>" );
1884 doc += solutions.join(
"</li><li>" );
1885 doc += QLatin1String(
"</li></ul>" );
1888 html.replace( QLatin1String(
"TEXT"), doc );
1919 if (job->error() == KIO::ERR_IS_DIRECTORY)
1921 emit
canceled( job->errorString() );
1926 emit
canceled( job->errorString() );
1935 if (tjob && tjob->isErrorPage()) {
1936 HTMLPartContainerElementImpl *elt = d->
m_frame ?
1937 d->
m_frame->m_partContainerElement.data() : 0;
1942 elt->partLoadingErrorNotify();
1952 KIO::http_update_cache(
url(),
false, d->
m_doc->docLoader()->expireDate());
1963 if (mimeStr ==
"application/xhtml+xml")
1965 if (mimeStr ==
"image/svg+xml")
1967 if (mimeStr ==
"text/html" || mimeStr.isEmpty())
1970 KMimeType::Ptr mime = KMimeType::mimeType(mimeStr, KMimeType::ResolveAliases);
1971 if ((mime && mime->is(
"text/xml")) || mimeStr.endsWith(
"+xml"))
1974 if (mime && mime->is(
"text/plain"))
1977 if (khtmlImLoad::ImageManager::loaderDatabase()->supportedMimeTypes().contains(mimeStr))
1993 if ( d->
m_view->underMouse() )
1994 QToolTip::hideText();
1998 removeJSErrorExtension();
2003 KJS::Window *w = KJS::Window::retrieveWindow( part );
2005 w->forgetSuppressedWindows();
2021 if ( urlString != urlString2 ) {
2045 d->
m_doc = DOMImplementationImpl::createSVGDocument( d->
m_view );
2049 d->
m_doc = DOMImplementationImpl::createXMLDocument( d->
m_view );
2057 d->
m_doc = DOMImplementationImpl::createHTMLDocument( d->
m_view );
2059 static_cast<HTMLDocumentImpl *
>(d->
m_doc)->setHTMLRequested( type !=
MimeXHTML );
2065 if (!d->
m_doc->attached())
2066 d->
m_doc->attach( );
2076 if ( !userStyleSheet.isEmpty() )
2080 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2084 d->
m_doc->setParsing(
true);
2093 len = strlen( data );
2100 if(decoded.isEmpty())
2106 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2108 t->write( decoded,
true );
2125 d->
m_doc->setParseMode( DocumentImpl::Strict );
2131 khtml::Tokenizer* t = d->
m_doc->tokenizer();
2133 t->write( str,
true );
2144 if (!decoded.isEmpty())
2147 d->
m_doc->finishParsing();
2151 void KHTMLPart::onFirstData()
2156 d->
m_doc->determineParseMode();
2162 d->
m_doc->setVisuallyOrdered();
2165 d->
m_doc->recalcStyle( NodeImpl::Force );
2170 KMimeType::Ptr mime = KMimeType::mimeType(mimeType, KMimeType::ResolveAliases);
2171 if ( mime && ( mime->is(
"text/html" ) || mime->is(
"text/xml" ) ) )
2181 write( data.data(), data.size() );
2195 d->
m_view->paint(p, rc, yOff, more);
2205 for (; it !=
end; ++it ) {
2206 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
2211 void KHTMLPart::resetFromScript()
2216 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2217 connect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2218 d->
m_doc->setParsing(
true);
2223 void KHTMLPart::slotFinishedParsing()
2225 d->
m_doc->setParsing(
false);
2226 d->
m_doc->dispatchHTMLEvent(EventImpl::KHTML_CONTENTLOADED_EVENT,
true,
false);
2227 checkEmitLoadEvent();
2228 disconnect(d->
m_doc,SIGNAL(finishedParsing()),
this,SLOT(slotFinishedParsing()));
2236 void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
2238 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2263 void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
2265 if ( obj && obj->type() == khtml::CachedObject::Image && d->
m_doc && d->
m_doc->docLoader() == dl ) {
2285 void KHTMLPart::slotProgressUpdate()
2306 void KHTMLPart::slotJobSpeed(
KJob* ,
unsigned long speed )
2313 void KHTMLPart::slotJobPercent(
KJob* ,
unsigned long percent )
2323 void KHTMLPart::slotJobDone(
KJob* )
2333 void KHTMLPart::slotUserSheetStatDone(
KJob *_job )
2335 using namespace KIO;
2337 if ( _job->error() ) {
2359 *pendingRedirections =
false;
2364 for (; it !=
end; ++it ) {
2365 if ( !(*it)->m_bCompleted || (*it)->m_run )
2371 if ( (*it)->m_bPendingRedirection )
2372 *pendingRedirections =
true;
2380 for (; oi != oiEnd; ++oi )
2381 if ( !(*oi)->m_bCompleted )
2386 if ( m_doc && m_doc->parsing() )
2391 if ( m_doc && m_doc->docLoader() )
2392 requests = khtml::Cache::loader()->numRequests( m_doc->docLoader() );
2403 void KHTMLPart::checkCompleted()
2418 bool fullyLoaded, pendingChildRedirections;
2442 checkEmitLoadEvent();
2444 bool pendingAction =
false;
2458 pendingAction =
true;
2460 else if ( pendingChildRedirections )
2462 pendingAction =
true;
2469 d->
m_view->complete( pendingAction );
2474 sheets = d->
m_doc->availableStyleSheets();
2475 sheets.prepend(
i18n(
"Automatic Detection" ) );
2479 if (sheets.count() > 2)
2482 slotUseStylesheet();
2493 void KHTMLPart::checkEmitLoadEvent()
2495 bool fullyLoaded, pendingChildRedirections;
2511 #ifndef KDE_NO_COMPAT // KDE5: remove this ifndef, keep the method (renamed to baseUrl)
2516 return d->
m_doc->baseURL();
2529 return KUrl( d->
m_doc->completeURL( url ) );
2534 return KUrl::fromPercentEncoding( u.right( u.length() - 11 ).toUtf8() );
2539 QString script = codeForJavaScriptURL(u);
2540 kDebug( 6050 ) <<
"script=" << script;
2543 q->begin( q->url() );
2544 q->setAlwaysHonourDoctype();
2545 q->write( res.toString() );
2548 emit q->completed();
2553 return url.indexOf( QLatin1String(
"javascript:" ), 0, Qt::CaseInsensitive ) == 0;
2560 kDebug(6050) <<
"delay=" << delay <<
" url=" << url <<
" from=" << this->
url() <<
"parent=" <<
parentPart();
2571 if( delay < 24*60*60 &&
2588 m_delayRedirect = 0;
2589 m_redirectURL.clear();
2590 m_redirectionTimer.stop();
2593 void KHTMLPart::slotRedirect()
2613 if (!KAuthorized::authorizeUrlAction(
"redirect", cUrl, url))
2615 kWarning(6050) <<
"KHTMLPart::scheduleRedirection: Redirection from " << cUrl <<
" to " << url <<
" REJECTED!";
2620 if ( url.
equals(this->url(),
2638 if ( !
urlSelected( u, 0, 0,
"_self", args, browserArgs ) ) {
2644 void KHTMLPart::slotRedirection(
KIO::Job*,
const KUrl& url)
2657 if( !
url().isEmpty() ) {
2678 return defaultEncoding();
2681 QString KHTMLPart::defaultEncoding()
const
2684 if ( !encoding.isEmpty() )
2689 return "iso-8859-1";
2691 return KGlobal::locale()->encoding();
2697 (
void)
new khtml::PartStyleSheetLoader(
this, url.
url(), d->
m_doc->docLoader());
2703 d->
m_doc->setUserStyleSheet( styleSheet );
2711 HTMLCollectionImpl *anchors =
2712 new HTMLCollectionImpl( d->
m_doc, HTMLCollectionImpl::DOC_ANCHORS);
2714 NodeImpl *n = anchors->namedItem(name);
2718 n = d->
m_doc->getElementById( name );
2721 d->
m_doc->setCSSTarget(n);
2724 bool quirkyName = !n && !d->
m_doc->inStrictMode() && (name.isEmpty() || name.toLower() ==
"top");
2730 kDebug(6050) << name <<
"not found";
2736 HTMLElementImpl *a =
static_cast<HTMLElementImpl *
>(n);
2738 a->getUpperLeftCorner(x, y);
2739 if (x <= d->m_view->contentsX())
2742 gox = d->
m_view->contentsX();
2743 if ( x + 10 > d->
m_view->contentsX()+d->
m_view->visibleWidth()) {
2744 a->getLowerRightCorner(x, dummy);
2745 gox = x - d->
m_view->visibleWidth() + 10;
2749 d->
m_view->setContentsPos(gox, y);
2758 d->
m_view->focusNextPrevNode (
true );
2767 d->
m_view->focusNextPrevNode (
false );
2816 this->*flag = value;
2822 for (; it != itEnd; ++it) {
2832 for (; it != itEnd; ++it) {
2840 void KHTMLPart::initCaret()
2846 if (d->
m_doc->isHTMLDocument()) {
2847 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->
m_doc);
2848 node = htmlDoc->body();
2862 if (!khtml::KHTMLPartAccessor::caret(part).caretPos().node()->isContentEditable())
2916 Q_UNUSED(extendSelection);
2917 #ifndef KHTML_NO_CARET
2919 kDebug(6200) <<
"node: " << node.
handle() <<
" nodeName: "
2921 <<
" extendSelection " << extendSelection;
2922 if (
view()->moveCaretTo(node.
handle(), offset, !extendSelection))
2923 emitSelectionChanged();
2924 view()->ensureCaretVisible();
2926 #endif // KHTML_NO_CARET
2932 #ifndef KHTML_NO_CARET
2934 #else // KHTML_NO_CARET
2936 #endif // KHTML_NO_CARET
2945 #ifndef KHTML_NO_CARET
2946 view()->setCaretDisplayPolicyNonFocused(policy);
2947 #endif // KHTML_NO_CARET
2955 if (
isCaretMode() || (caretNode && caretNode->isContentEditable())) {
2956 invalidateSelection();
2957 enableFindAheadActions(
false);
2963 clearCaretRectIfNeeded();
2973 bool KHTMLPart::initFindNode(
bool selection,
bool reverse,
bool fromCursor )
2978 void KHTMLPart::slotFind()
2983 if (!part->inherits(
"KHTMLPart") )
2985 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
2991 void KHTMLPart::slotFindNext()
2996 if (!part->inherits(
"KHTMLPart") )
2998 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
3004 void KHTMLPart::slotFindPrev()
3009 if (!part->inherits(
"KHTMLPart") )
3011 kError(6000) <<
"part is a" << part->metaObject()->className() <<
", can't do a search into it";
3017 void KHTMLPart::slotFindDone()
3022 void KHTMLPart::slotFindAheadText()
3032 void KHTMLPart::slotFindAheadLink()
3042 void KHTMLPart::enableFindAheadActions(
bool )
3047 void KHTMLPart::slotFindDialogDestroyed()
3074 bool KHTMLPart::pFindTextNextInThisFrame(
bool reverse )
3083 kDebug() <<
"Selection is not valid. Returning empty selection";
3086 if(sel.start().offset() < 0 || sel.end().offset() < 0) {
3087 kDebug() <<
"invalid values for end/startOffset " << sel.start().offset() <<
" " << sel.end().offset();
3093 int exceptioncode = 0;
3094 return r.
handle()->toHTML(exceptioncode).string();
3099 bool hasNewLine =
true;
3100 bool seenTDTag =
false;
3106 DOM::DOMStringImpl *dstr =
static_cast<DOM::TextImpl*
>(n.
handle())->renderString();
3107 QString str(dstr->s, dstr->l);
3108 if(!str.isEmpty()) {
3114 if(n == sel.start().node() && n == sel.end().node()) {
3115 int s = khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset();
3116 int e = khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset();
3117 text = str.mid(s, e-s);
3118 }
else if(n == sel.start().node()) {
3119 text = str.mid(khtml::RenderPosition::fromDOMPosition(sel.start()).renderedOffset());
3120 }
else if(n == sel.end().node()) {
3121 text += str.left(khtml::RenderPosition::fromDOMPosition(sel.end()).renderedOffset());
3131 text +=
static_cast<HTMLTextAreaElementImpl*
>(n.
handle())->value().string();
3134 if (static_cast<HTMLInputElementImpl*>(n.
handle())->inputType() != HTMLInputElementImpl::PASSWORD)
3135 text += static_cast<HTMLInputElementImpl*>(n.
handle())->value().string();
3138 text +=
static_cast<HTMLSelectElementImpl*
>(n.
handle())->value().string();
3145 text +=
static_cast<HTMLImageElementImpl*
>(n.
handle())->altText().string();
3179 if(n == sel.end().node())
break;
3230 int end = text.length();
3233 while ((start < end) && (text[start] ==
'\n'))
3237 while ((start < (end-1)) && (text[end-1] ==
'\n') && (text[end-2] ==
'\n'))
3240 return text.mid(start, end-start);
3243 QString KHTMLPart::simplifiedSelectedText()
const
3246 text.replace(QChar(0xa0),
' ');
3248 while (!text.isEmpty() && text[0].isSpace())
3250 while (!text.isEmpty() && text[text.length()-1].isSpace())
3251 text.truncate(text.length()-1);
3279 const Selection &KHTMLPart::caret()
const
3284 const Selection &KHTMLPart::dragCaret()
const
3289 void KHTMLPart::setCaret(
const Selection &s,
bool closeTyping)
3292 clearCaretRectIfNeeded();
3293 setFocusNodeIfNeeded(s);
3295 notifySelectionChanged(closeTyping);
3299 void KHTMLPart::setDragCaret(
const DOM::Selection &dragCaret)
3308 void KHTMLPart::clearSelection()
3310 clearCaretRectIfNeeded();
3312 #ifdef APPLE_CHANGES
3317 notifySelectionChanged();
3320 void KHTMLPart::invalidateSelection()
3322 clearCaretRectIfNeeded();
3324 selectionLayoutChanged();
3327 void KHTMLPart::setSelectionVisible(
bool flag)
3332 clearCaretRectIfNeeded();
3339 void KHTMLPart::slotClearSelection()
3344 clearCaretRectIfNeeded();
3346 #ifdef APPLE_CHANGES
3352 notifySelectionChanged();
3356 void KHTMLPart::clearCaretRectIfNeeded()
3364 void KHTMLPart::setFocusNodeIfNeeded(
const Selection &s)
3366 if (!xmlDocImpl() || s.state() == Selection::NONE)
3369 NodeImpl *n = s.start().node();
3370 NodeImpl *target = (n && n->isContentEditable()) ? n : 0;
3372 while (n && n != s.end().node()) {
3373 if (n->isContentEditable()) {
3377 n = n->traverseNextNode();
3380 assert(target == 0 || target->isContentEditable());
3383 for ( ; target && !target->isFocusable(); target = target->parentNode())
3385 if (target && target->isMouseFocusable())
3386 xmlDocImpl()->setFocusNode(target);
3387 else if (!target || !target->focused())
3388 xmlDocImpl()->setFocusNode(0);
3392 void KHTMLPart::selectionLayoutChanged()
3411 d->
m_view->ensureVisible(r.x(), r.y());
3415 d->
m_doc->updateSelection();
3422 void KHTMLPart::notifySelectionChanged(
bool closeTyping)
3425 selectionLayoutChanged();
3433 emitSelectionChanged();
3468 int dots = name.count(
'.');
3469 if (dots > 2 || (dots == 2 && !name.startsWith(
"www.")))
3488 void KHTMLPart::paintCaret(QPainter *p,
const QRect &rect)
const
3494 void KHTMLPart::paintDragCaret(QPainter *p,
const QRect &rect)
const
3505 void KHTMLPart::resetHoverText()
3513 setStatusBarText(
QString(), BarHoverText);
3518 void KHTMLPart::overURL(
const QString &url,
const QString &target,
bool )
3523 if ( url.isEmpty() )
3528 if ( url.isEmpty() ) {
3529 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3535 jscode = KStringHandler::rsqueeze( jscode, 80 );
3536 if (url.startsWith(
"javascript:window.open"))
3537 jscode +=
i18n(
" (In new window)");
3538 setStatusBarText( Qt::escape( jscode ), BarHoverText );
3550 com = typ->comment( u );
3552 if ( !u.isValid() ) {
3553 setStatusBarText(Qt::escape(u.
prettyUrl()), BarHoverText);
3563 KDE_struct_stat buff;
3564 bool ok = !KDE::stat( path, &buff );
3566 KDE_struct_stat lbuff;
3567 if (ok) ok = !KDE::lstat( path, &lbuff );
3572 if (ok && S_ISLNK( lbuff.st_mode ) )
3576 tmp =
i18n(
"Symbolic Link");
3578 tmp =
i18n(
"%1 (Link)", com);
3579 char buff_two[1024];
3581 int n = readlink ( path.toLocal8Bit().data(), buff_two, 1022);
3586 setStatusBarText(text2, BarHoverText);
3595 else if ( ok && S_ISREG( buff.st_mode ) )
3597 if (buff.st_size < 1024)
3598 text =
i18np(
"%2 (%1 byte)",
"%2 (%1 bytes)", (
long) buff.st_size, text2);
3601 float d = (float) buff.st_size/1024.0;
3602 text =
i18n(
"%2 (%1 K)", KGlobal::locale()->formatNumber(d, 2), text2);
3607 else if ( ok && S_ISDIR( buff.st_mode ) )
3617 setStatusBarText(text, BarHoverText);
3622 if (target.toLower() ==
"_blank")
3624 extra =
i18n(
" (In new window)");
3626 else if (!target.isEmpty() &&
3627 (target.toLower() !=
"_top") &&
3628 (target.toLower() !=
"_self") &&
3629 (target.toLower() !=
"_parent"))
3635 extra =
i18n(
" (In new window)");
3637 extra =
i18n(
" (In other frame)");
3640 if (u.
protocol() == QLatin1String(
"mailto")) {
3642 mailtoMsg +=
i18n(
"Email to: ") + KUrl::fromPercentEncoding(u.
path().toLatin1());
3644 QStringList::ConstIterator it = queries.begin();
3645 const QStringList::ConstIterator itEnd = queries.end();
3646 for (; it != itEnd; ++it)
3647 if ((*it).startsWith(QLatin1String(
"subject=")))
3648 mailtoMsg +=
i18n(
" - Subject: ") + KUrl::fromPercentEncoding((*it).mid(8).toLatin1());
3649 else if ((*it).startsWith(QLatin1String(
"cc=")))
3650 mailtoMsg +=
i18n(
" - CC: ") + KUrl::fromPercentEncoding((*it).mid(3).toLatin1());
3651 else if ((*it).startsWith(QLatin1String(
"bcc=")))
3652 mailtoMsg +=
i18n(
" - BCC: ") + KUrl::fromPercentEncoding((*it).mid(4).toLatin1());
3653 mailtoMsg = Qt::escape(mailtoMsg);
3654 mailtoMsg.replace(QRegExp(
"([\n\r\t]|[ ]{10})"),
QString());
3655 setStatusBarText(
"<qt>"+mailtoMsg, BarHoverText);
3660 else if (u.
protocol() == QLatin1String(
"http")) {
3665 if (!hrefNode.
isNull()) {
3667 if (!hreflangNode.
isNull()) {
3670 if (countryCode == QLatin1String(
"en"))
3671 countryCode = QLatin1String(
"gb");
3672 QString flagImg = QLatin1String(
"<img src=%1>").arg(
3673 locate(
"locale", QLatin1String(
"l10n/")
3675 + QLatin1String(
"/flag.png")));
3676 emit setStatusBarText(flagImg + u.
prettyUrl() + extra);
3681 setStatusBarText(Qt::escape(u.
prettyUrl()) + extra, BarHoverText);
3693 bool hasTarget =
false;
3696 if ( target.isEmpty() && d->m_doc )
3697 target = d->m_doc->baseTarget();
3698 if ( !target.isEmpty() )
3701 if ( d->isJavaScriptURL(url) )
3703 crossFrameExecuteScript( target, d->codeForJavaScriptURL(url) );
3709 if ( url.isEmpty() )
3712 if ( !cURL.isValid() )
3716 kDebug(6050) <<
this <<
"complete URL:" << cURL.
url() <<
"target=" << target;
3718 if ( state & Qt::ControlModifier )
3720 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3724 if ( button == Qt::LeftButton && ( state & Qt::ShiftModifier ) )
3727 metaData.insert(
"referrer", d->m_referrer );
3732 if (!checkLinkSecurity(cURL,
3733 ki18n(
"<qt>This untrusted page links to<br /><b>%1</b>.<br />Do you want to follow the link?</qt>" ),
3739 args.
metaData().insert(
"main_frame_request",
3741 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
3742 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
3743 args.
metaData().insert(
"PropagateHttpHeader",
"true");
3744 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
3745 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
3747 if ( hasTarget && target !=
"_self" && target !=
"_top" && target !=
"_blank" && target !=
"_parent" )
3750 khtml::ChildFrame *frame = recursiveFrameRequest(
this, cURL, args, browserArgs,
false );
3753 args.
metaData()[
"referrer"] = d->m_referrer;
3754 requestObject( frame, cURL, args, browserArgs );
3759 if (!d->m_referrer.isEmpty() && !args.
metaData().contains(
"referrer"))
3760 args.
metaData()[
"referrer"] = d->m_referrer;
3762 if ( button == Qt::NoButton && (state & Qt::ShiftModifier) && (state & Qt::ControlModifier) )
3764 emit d->m_extension->createNewWindow( cURL, args, browserArgs );
3768 if ( state & Qt::ShiftModifier)
3772 emit d->m_extension->createNewWindow( cURL, args, browserArgs, winArgs );
3779 if (cURL.
hasRef() && (!hasTarget || target ==
"_self"))
3781 if (d->isLocalAnchorJump(cURL))
3783 d->executeAnchorJump(cURL, browserArgs.
lockHistory() );
3788 if ( !d->m_bComplete && !hasTarget )
3791 view()->viewport()->unsetCursor();
3792 emit d->m_extension->openUrlRequest( cURL, args, browserArgs );
3796 void KHTMLPart::slotViewDocumentSource()
3799 bool isTempFile =
false;
3803 sourceFile.
setSuffix(defaultExtension());
3804 sourceFile.setAutoRemove(
false);
3805 if (sourceFile.open())
3807 QDataStream stream ( &sourceFile );
3809 currentUrl =
KUrl();
3810 currentUrl.setPath(sourceFile.fileName());
3815 (void)
KRun::runUrl( currentUrl, QLatin1String(
"text/plain"),
view(), isTempFile );
3818 void KHTMLPart::slotViewPageInfo()
3823 dlg->setAttribute(Qt::WA_DeleteOnClose);
3824 dlg->setObjectName(
"KHTML Page Info Dialog");
3827 ui._close->setGuiItem(KStandardGuiItem::close());
3829 connect(ui._close, SIGNAL(clicked()), dlg, SLOT(accept()));
3831 ui._title->setText(d->m_doc->title().string());
3834 if (
parentPart() && d->m_doc && d->m_doc->isHTMLDocument() ) {
3835 dlg->setWindowTitle(
i18n(
"Frame Information"));
3840 if (!d->m_pageServices.isEmpty())
3841 editStr =
i18n(
" <a href=\"%1\">[Properties]</a>", d->m_pageServices);
3843 QString squeezedURL = KStringHandler::csqueeze(
url().prettyUrl(), 80 );
3844 ui._url->setText(
"<a href=\"" +
url().
url() +
"\">" + squeezedURL +
"</a>" + editStr);
3847 ui._lastModified->hide();
3848 ui._lmLabel->hide();
3854 if (enc.isEmpty()) {
3856 ui._encoding->hide();
3858 ui._encoding->setText(enc);
3861 if (!xmlDocImpl() || xmlDocImpl()->parseMode() == DOM::DocumentImpl::Unknown) {
3863 ui._modeLabel->hide();
3865 switch (xmlDocImpl()->parseMode()) {
3866 case DOM::DocumentImpl::Compat:
3867 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Quirks"));
3869 case DOM::DocumentImpl::Transitional:
3870 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Almost standards"));
3872 case DOM::DocumentImpl::Strict:
3874 ui._mode->setText(
i18nc(
"HTML rendering mode (see http://en.wikipedia.org/wiki/Quirks_mode)",
"Strict"));
3880 const QStringList headers = d->m_httpHeaders.split(
"\n");
3882 QStringList::ConstIterator it = headers.begin();
3883 const QStringList::ConstIterator itEnd = headers.end();
3885 for (; it != itEnd; ++it) {
3887 if (header.count() != 2)
3889 QTreeWidgetItem *item =
new QTreeWidgetItem(ui._headers);
3890 item->setText(0, header[0]);
3891 item->setText(1, header[1]);
3899 void KHTMLPart::slotViewFrameSource()
3906 bool isTempFile =
false;
3907 if (!(url.
isLocalFile()) && frame->inherits(
"KHTMLPart"))
3909 long cacheId =
static_cast<KHTMLPart *
>(frame)->d->m_cacheId;
3914 sourceFile.
setSuffix(defaultExtension());
3915 sourceFile.setAutoRemove(
false);
3916 if (sourceFile.open())
3918 QDataStream stream ( &sourceFile );
3921 url.
setPath(sourceFile.fileName());
3927 (void)
KRun::runUrl( url, QLatin1String(
"text/plain"),
view(), isTempFile );
3933 if (!d->m_doc || !d->m_doc->isHTMLDocument())
3936 QString relURL =
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
3941 void KHTMLPart::slotSaveBackground()
3944 metaData[
"referrer"] = d->m_referrer;
3948 void KHTMLPart::slotSaveDocument()
3953 srcURL.setFileName(
"index" + defaultExtension() );
3960 void KHTMLPart::slotSecurity()
3984 const QStringList sl = d->m_ssl_peer_chain.split(
'\n', QString::SkipEmptyParts);
3986 bool certChainOk = d->m_ssl_in_use;
3988 foreach (
const QString &s, sl) {
3989 certChain.append(QSslCertificate(s.toLatin1()));
3990 if (certChain.last().isNull()) {
3991 certChainOk =
false;
3997 kid->setup(certChain,
4001 d->m_ssl_cipher_desc,
4002 d->m_ssl_cipher_version,
4003 d->m_ssl_cipher_used_bits.toInt(),
4004 d->m_ssl_cipher_bits.toInt(),
4013 QStringList sl = d->m_ssl_peer_chain.split(
'\x01', QString::SkipEmptyParts);
4015 bool decodedOk =
true;
4016 foreach (
const QString &s, sl) {
4017 certChain.append(QSslCertificate(s.toLatin1()));
4018 if (certChain.last().isNull()) {
4024 if (decodedOk ||
true ) {
4028 d->m_ssl_protocol_version,
4030 d->m_ssl_cipher_used_bits.toInt(),
4031 d->m_ssl_cipher_bits.toInt(),
4033 kDebug(7024) <<
"Showing SSL Info dialog";
4035 kDebug(7024) <<
"SSL Info dialog closed";
4038 "appears to be corrupt."),
4043 void KHTMLPart::slotSaveFrame()
4052 srcURL.
setFileName(
"index" + defaultExtension() );
4059 void KHTMLPart::slotSetEncoding(
const QString &enc)
4067 d->m_autoDetectLanguage=scri;
4071 void KHTMLPart::slotUseStylesheet()
4075 bool autoselect = (d->m_paUseStylesheet->currentItem() == 0);
4076 d->m_sheetUsed = autoselect ?
QString() : d->m_paUseStylesheet->currentText();
4077 d->m_doc->updateStyleSelector();
4081 void KHTMLPart::updateActions()
4083 bool frames =
false;
4087 for (; it !=
end; ++it )
4094 if (d->m_paViewFrame)
4095 d->m_paViewFrame->setEnabled( frames );
4096 if (d->m_paSaveFrame)
4097 d->m_paSaveFrame->setEnabled( frames );
4100 d->m_paFind->setText(
i18n(
"&Find in Frame..." ) );
4102 d->m_paFind->setText(
i18n(
"&Find..." ) );
4109 bool enableFindAndSelectAll =
true;
4112 enableFindAndSelectAll = frame->inherits(
"KHTMLPart" );
4114 d->m_paFind->setEnabled( enableFindAndSelectAll );
4115 d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
4117 bool enablePrintFrame =
false;
4123 enablePrintFrame = ext->metaObject()->indexOfSlot(
"print()" ) != -1;
4126 d->m_paPrintFrame->setEnabled( enablePrintFrame );
4131 if ( d->m_doc && d->m_doc->isHTMLDocument() &&
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body() && !d->m_bClearing )
4132 bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4134 if (d->m_paSaveBackground)
4135 d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
4137 if ( d->m_paDebugScript )
4138 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
4144 if ((*it)->m_partContainerElement.data() == frame)
4145 return (*it)->m_scriptable.data();
4149 void KHTMLPart::loadFrameElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4155 FrameIt it = d->m_frames.find( frameName );
4156 if ( it == d->m_frames.end() ) {
4159 child->
m_name = frameName;
4160 d->m_frames.insert( d->m_frames.end(), child );
4172 QString khtml = QString::fromLatin1(
"khtml");
4174 QString::fromLatin1(
"text/html"),
4181 navigateLocalProtocol(child, part,
KUrl(
"about:blank"));
4182 connectToChildPart(child, part,
"text/html" );
4192 if (!requestObject( child, u ) && !child->
m_run) {
4197 QString KHTMLPart::requestFrameName()
4199 return QString::fromLatin1(
"<!--frame %1-->").arg(d->m_frameNameId++);
4202 bool KHTMLPart::loadObjectElement( DOM::HTMLPartContainerElementImpl *frame,
const QString &url,
4207 FrameIt it = d->m_objects.insert( d->m_objects.end(), child );
4210 (*it)->m_params = params;
4214 if (!requestObject( *it,
completeURL( url ), args ) && !(*it)->m_run) {
4215 (*it)->m_bCompleted =
true;
4226 if (!d->isJavaScriptURL(url.
url()) && !checkLinkSecurity(url))
4228 kDebug(6031) <<
this <<
"checkLinkSecurity refused";
4250 if ( child->
m_run ) {
4251 kDebug(6031) <<
"navigating ChildFrame while mimetype resolution was in progress...";
4252 child->
m_run.data()->abort();
4268 if (!d->m_referrer.isEmpty() && !child->
m_args.
metaData().contains(
"referrer" ))
4272 child->
m_args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4273 child->
m_args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4277 d->m_ssl_in_use ?
"TRUE":
"FALSE");
4278 child->
m_args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4284 if ((url.isEmpty() || url.
url() ==
"about:blank" || url.
protocol() ==
"javascript") && args.
mimeType().isEmpty())
4288 kDebug(6031) <<
"Running new KHTMLRun for" <<
this <<
"and child=" << child;
4290 d->m_bComplete =
false;
4293 return processObjectRequest( child, url, args.
mimeType() );
4308 kDebug( 6031 ) <<
"trying to create part for" << mimetype << _url;
4318 if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) ) {
4319 childLoadFailure(child);
4331 emit d->m_extension->openUrlNotify();
4345 (child->
m_run && child->
m_run.data()->serverSuggestsSave())) {
4364 int disposition = 0;
4366 suggestedFileName =
run->suggestedFileName();
4367 disposition =
run->serverSuggestsSave() ?
4373 dlg.setSuggestedFileName( suggestedFileName );
4398 if (mime->is(
"text/html")
4399 || mime->is(
"application/xml")) {
4408 childLoadFailure(child);
4412 connectToChildPart( child, part, mimetype );
4416 checkEmitLoadEvent();
4449 return navigateChild( child, url );
4455 if (!qobject_cast<KHTMLPart*>(inPart))
4463 d->propagateInitialDomainAndBaseTo(p);
4466 if (d->isJavaScriptURL(url.
url())) {
4469 d->codeForJavaScriptURL(url.
url()));
4474 d->propagateInitialDomainAndBaseTo(p);
4475 p->
write( res.toString() );
4481 p->
write(
"<HTML><TITLE></TITLE><BODY></BODY></HTML>");
4491 if (url.
protocol() ==
"javascript" || url.
url() ==
"about:blank") {
4492 return navigateLocalProtocol(child, child->
m_part.data(),
url);
4493 }
else if ( !url.isEmpty() ) {
4494 kDebug( 6031 ) <<
"opening" << url <<
"in frame" << child->
m_part;
4495 bool b = child->
m_part.data()->openUrl( url );
4510 kDebug(6031) <<
"we:" <<
this <<
"kid:" << child << part << mimetype;
4512 part->setObjectName( child->
m_name );
4516 if (!qobject_cast<KHTMLPart*>(p) && child->
m_jscript)
4534 if (qobject_cast<KHTMLPart*>(part)) {
4535 static_cast<KHTMLPart*
>(part)->d->m_frame = child;
4547 scriptExt->
setHost(d->m_scriptableExtension);
4552 sb->
setStatusBar( d->m_statusBarExtension->statusBar() );
4555 this, SLOT(slotChildStarted(
KIO::Job*)) );
4557 this, SLOT(slotChildCompleted()) );
4559 this, SLOT(slotChildCompleted(
bool)) );
4560 connect( part, SIGNAL(setStatusBarText(
QString)),
4561 this, SIGNAL(setStatusBarText(
QString)) );
4562 if ( part->inherits(
"KHTMLPart" ) )
4565 part, SLOT(slotParentCompleted()) );
4567 part, SLOT(slotParentCompleted()) );
4571 this, SLOT(slotChildDocCreated()) );
4578 connect( kidBrowserExt, SIGNAL(openUrlNotify()),
4579 d->m_extension, SIGNAL(openUrlNotify()) );
4592 connect( kidBrowserExt, SIGNAL(infoMessage(
QString)),
4593 d->m_extension, SIGNAL(infoMessage(
QString)) );
4598 kidBrowserExt->setBrowserInterface( d->m_extension->browserInterface() );
4608 if ( !serviceName.isEmpty() )
4609 constr.append( QString::fromLatin1(
"DesktopEntryName == '%1'" ).arg( serviceName ) );
4613 if ( offers.isEmpty() ) {
4614 int pos = mimetype.indexOf(
"-plugin" );
4617 QString stripped_mime = mimetype.left( pos );
4619 if ( offers.isEmpty() )
4623 KService::List::ConstIterator it = offers.constBegin();
4624 const KService::List::ConstIterator itEnd = offers.constEnd();
4625 for ( ; it != itEnd; ++it )
4633 QVariantList variantlist;
4634 Q_FOREACH(
const QString& str, params)
4637 if ( service->
serviceTypes().contains(
"Browser/View" ) )
4638 variantlist <<
QString(
"Browser/View");
4643 serviceName = service->name();
4648 kWarning() <<
QString(
"There was an error loading the module %1.\nThe diagnostics is:\n%2")
4657 if ( !d->m_manager && d->m_view )
4660 d->m_manager->setObjectName(
"khtml part manager" );
4662 connect( d->m_manager, SIGNAL(activePartChanged(
KParts::Part*)),
4664 connect( d->m_manager, SIGNAL(partRemoved(
KParts::Part*)),
4668 return d->m_manager;
4671 void KHTMLPart::submitFormAgain()
4673 disconnect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4674 if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
4675 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 );
4677 delete d->m_submitForm;
4678 d->m_submitForm = 0;
4683 submitForm(action, url, formData, _target, contentType, boundary);
4686 void KHTMLPart::submitForm(
const char *action,
const QString &url,
const QByteArray &formData,
const QString &_target,
const QString& contentType,
const QString& boundary )
4688 kDebug(6000) <<
this <<
"target=" << _target <<
"url=" <<
url;
4716 if (!d->m_submitForm) {
4718 if (d->m_ssl_in_use) {
4720 "\nA third party may be able to intercept and view this information."
4721 "\nAre you sure you wish to continue?"),
4727 if (kss.warnOnUnencrypted()) {
4729 i18n(
"Warning: Your data is about to be transmitted across the network unencrypted."
4730 "\nAre you sure you wish to continue?"),
4731 i18n(
"Network Transmission"),
4733 KStandardGuiItem::cancel(),
4734 "WarnOnUnencryptedForm");
4736 QString grpNotifMsgs = QLatin1String(
"Notification Messages");
4739 if (!cg.readEntry(
"WarnOnUnencryptedForm",
true)) {
4740 cg.deleteEntry(
"WarnOnUnencryptedForm");
4742 kss.setWarnOnUnencrypted(
false);
4753 i18n(
"This site is attempting to submit form data via email.\n"
4754 "Do you want to continue?"),
4755 i18n(
"Network Transmission"),
4757 KStandardGuiItem::cancel(),
4758 "WarnTriedEmailSubmit");
4771 if ( d->isJavaScriptURL(urlstring) ) {
4772 crossFrameExecuteScript( _target, d->codeForJavaScriptURL(urlstring) );
4776 if (!checkLinkSecurity(u,
4777 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>" ),
4783 d->clearRedirection();
4787 if (!d->m_referrer.isEmpty())
4788 args.
metaData()[
"referrer"] = d->m_referrer;
4790 args.
metaData().insert(
"PropagateHttpHeader",
"true");
4791 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4792 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4793 args.
metaData().insert(
"main_frame_request",
4795 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
4796 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4801 browserArgs.
frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
4808 bool triedToAttach =
false;
4810 QStringList::Iterator nvp = nvps.begin();
4811 const QStringList::Iterator nvpEnd = nvps.end();
4816 while (nvp != nvpEnd) {
4818 if (pair.count() >= 2) {
4819 if (pair.first().toLower() ==
"attach") {
4820 nvp = nvps.erase(nvp);
4821 triedToAttach =
true;
4831 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");
4835 if (contentType.toLower() ==
"multipart/form-data") {
4837 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4839 }
else if (contentType.toLower() ==
"text/plain") {
4841 QString tmpbody = QString::fromLatin1(formData.data(),
4843 tmpbody.replace(QRegExp(
"[&]"),
"\n");
4844 tmpbody.replace(QRegExp(
"[+]"),
" ");
4845 tmpbody = KUrl::fromPercentEncoding(tmpbody.toLatin1());
4846 bodyEnc = QLatin1String( KUrl::toPercentEncoding(tmpbody) );
4848 bodyEnc = QLatin1String( KUrl::toPercentEncoding(QString::fromLatin1(formData.data(),
4849 formData.size())) );
4852 nvps.append(
QString(
"body=%1").arg(bodyEnc));
4857 if (
strcmp( action,
"get" ) == 0 ) {
4859 u.
setQuery( QString::fromLatin1( formData.data(), formData.size() ) );
4867 if (contentType.isNull() || contentType ==
"application/x-www-form-urlencoded")
4868 browserArgs.
setContentType(
"Content-Type: application/x-www-form-urlencoded" );
4870 browserArgs.
setContentType(
"Content-Type: " + contentType +
"; boundary=" + boundary );
4873 if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
4874 if( d->m_submitForm ) {
4875 kDebug(6000) <<
"ABORTING!";
4880 d->m_submitForm->submitUrl =
url;
4881 d->m_submitForm->submitFormData = formData;
4882 d->m_submitForm->target = _target;
4883 d->m_submitForm->submitContentType = contentType;
4884 d->m_submitForm->submitBoundary = boundary;
4885 connect(
this, SIGNAL(
completed()),
this, SLOT(submitFormAgain()));
4889 emit d->m_extension->openUrlRequest( u, args, browserArgs );
4902 if ( linkUrl.isEmpty() ) {
4908 popupURL = khtmlPart->
url();
4916 linkKUrl = popupURL;
4920 if (!(d->m_strSelectedURLTarget).isEmpty() &&
4921 (d->m_strSelectedURLTarget.toLower() !=
"_top") &&
4922 (d->m_strSelectedURLTarget.toLower() !=
"_self") &&
4923 (d->m_strSelectedURLTarget.toLower() !=
"_parent")) {
4924 if (d->m_strSelectedURLTarget.toLower() ==
"_blank")
4939 QPointer<QObject> guard( client );
4941 QString mimetype = QLatin1String(
"text/html" );
4944 if (!linkUrl.isEmpty())
4948 mimetype = KMimeType::findByUrl(popupURL,0,
true,
false)->name();
4953 if (!fname.isEmpty() && !popupURL.
hasRef() && popupURL.
query().isEmpty())
4961 if (pmt->name() != KMimeType::defaultMimeType() &&
4962 !pmt->is(
"application/x-perl") &&
4963 !pmt->is(
"application/x-perl-module") &&
4964 !pmt->is(
"application/x-php") &&
4965 !pmt->is(
"application/x-python-bytecode") &&
4966 !pmt->is(
"application/x-python") &&
4967 !pmt->is(
"application/x-shellscript"))
4968 mimetype = pmt->name();
4975 emit d->m_extension->popupMenu( QCursor::pos(), popupURL, S_IFREG ,
4976 args, browserArgs, itemflags,
4979 if ( !guard.isNull() ) {
4981 emit
popupMenu(linkUrl, QCursor::pos());
4982 d->m_strSelectedURL.clear();
4983 d->m_strSelectedURLTarget.clear();
4987 void KHTMLPart::slotParentCompleted()
4990 if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
4993 d->m_redirectionTimer.setSingleShot(
true );
4994 d->m_redirectionTimer.start( qMax(0, 1000 * d->m_delayRedirect) );
4998 void KHTMLPart::slotChildStarted(
KIO::Job *job )
5006 if ( d->m_bComplete )
5012 emit d->m_extension->openURLNotify();
5015 d->m_bComplete =
false;
5020 void KHTMLPart::slotChildCompleted()
5022 slotChildCompleted(
false );
5025 void KHTMLPart::slotChildCompleted(
bool pendingAction )
5037 if (!qobject_cast<KHTMLPart*>(child->
m_part))
5043 void KHTMLPart::slotChildDocCreated()
5048 if (
KHTMLPart* htmlFrame = qobject_cast<KHTMLPart*>(sender()))
5049 d->propagateInitialDomainAndBaseTo(htmlFrame);
5052 disconnect( sender(), SIGNAL(
docCreated()),
this, SLOT(slotChildDocCreated()) );
5059 if ( m_doc && kid->d->
m_doc ) {
5060 DocumentImpl* kidDoc = kid->d->
m_doc;
5061 if ( kidDoc->origin()->isEmpty() ) {
5062 kidDoc->setOrigin ( m_doc->origin() );
5063 kidDoc->setBaseURL( m_doc->baseURL() );
5075 if ( d->isJavaScriptURL(urlStr) ) {
5081 if ( !frameName.isEmpty() ) {
5082 if ( frameName == QLatin1String(
"_top" ) )
5084 emit d->m_extension->openUrlRequest( url, args, browserArgs );
5087 else if ( frameName == QLatin1String(
"_blank" ) )
5089 emit d->m_extension->createNewWindow( url, args, browserArgs );
5092 else if ( frameName == QLatin1String(
"_parent" ) )
5095 newBrowserArgs.frameName.clear();
5096 emit d->m_extension->openUrlRequest( url, args, newBrowserArgs );
5099 else if ( frameName != QLatin1String(
"_self" ) )
5101 khtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args, browserArgs );
5105 emit d->m_extension->openUrlRequest( url, args, browserArgs );
5116 requestObject( child, url, args, browserArgs );
5117 }
else if ( frameName==
"_self" )
5120 newBrowserArgs.frameName.clear();
5121 emit d->m_extension->openUrlRequest( url, args, newBrowserArgs );
5127 emit d->m_extension->requestFocus(
this);
5132 assert( obj->inherits(
"KParts::ReadOnlyPart" ) );
5135 FrameIt it = d->m_frames.begin();
5136 const FrameIt end = d->m_frames.end();
5137 for (; it !=
end; ++it ) {
5138 if ((*it)->m_part.data() == part )
5142 FrameIt oi = d->m_objects.begin();
5143 const FrameIt oiEnd = d->m_objects.end();
5144 for (; oi != oiEnd; ++oi ) {
5145 if ((*oi)->m_part.data() == part)
5154 bool KHTMLPart::checkFrameAccess(
KHTMLPart *callingHtmlPart)
5156 if (callingHtmlPart ==
this)
5159 if (!xmlDocImpl()) {
5160 #ifdef DEBUG_FINDFRAME
5161 kDebug(6050) <<
"Empty part" <<
this <<
"URL = " <<
url();
5167 if (callingHtmlPart && callingHtmlPart->xmlDocImpl() && xmlDocImpl()) {
5168 khtml::SecurityOrigin* actDomain = callingHtmlPart->xmlDocImpl()->origin();
5169 khtml::SecurityOrigin* destDomain = xmlDocImpl()->origin();
5171 if (actDomain->canAccess(destDomain))
5174 #ifdef DEBUG_FINDFRAME
5177 kDebug(6050) <<
"Unknown part/domain" << callingHtmlPart <<
"tries to access part" <<
this;
5192 #ifdef DEBUG_FINDFRAME
5193 kDebug(6050) << q <<
"URL =" << q->url() <<
"name =" << q->objectName() <<
"findFrameParent(" << f <<
")";
5198 if (!callingHtmlPart)
5201 if (!checkForNavigation && !q->checkFrameAccess(callingHtmlPart))
5204 if (!childFrame && !q->parentPart() && (q->objectName() == f)) {
5205 if (!checkForNavigation || callingHtmlPart->d->
canNavigate(q))
5209 FrameIt it = m_frames.find( f );
5210 const FrameIt end = m_frames.end();
5213 #ifdef DEBUG_FINDFRAME
5214 kDebug(6050) <<
"FOUND!";
5216 if (!checkForNavigation || callingHtmlPart->d->
canNavigate((*it)->m_part.data())) {
5223 it = m_frames.begin();
5224 for (; it !=
end; ++it )
5226 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5256 if (q->checkFrameAccess(b))
5260 if (q->parentPart() && top() == b)
5265 if (b->opener() && canNavigate(b->opener()))
5270 if (anc->checkFrameAccess(q))
5299 while ( part && part->inherits(
"KHTMLPart") &&
5300 static_cast<KHTMLPart *
>(part)->d->m_frames.count() > 0 ) {
5303 if ( !part )
return frameset;
5310 FrameIt it = d->m_frames.find( frameName );
5311 if ( it == d->m_frames.end() )
5317 return (!(*it)->m_partContainerElement.isNull());
5323 for (
int i = 0; i < m_frames.size(); ++i) {
5334 return kp->jScript();
5336 FrameIt it = d->m_frames.begin();
5337 const FrameIt itEnd = d->m_frames.end();
5339 for (; it != itEnd; ++it) {
5341 if (framePart == frame->
m_part.data()) {
5352 return qobject_cast<
KHTMLPart*>( parent() );
5359 #ifdef DEBUG_FINDFRAME
5360 kDebug( 6050 ) <<
this <<
"frame = " << args.frameName <<
"url = " <<
url;
5366 if (childPart ==
this)
5369 childPart->requestObject( childFrame, url, args, browserArgs );
5378 parentPart()->requestObject( res, url, args, browserArgs );
5384 #ifdef DEBUG_SAVESTATE
5385 static int s_saveStateIndentLevel = 0;
5390 #ifdef DEBUG_SAVESTATE
5392 const int indentLevel = s_saveStateIndentLevel++;
5393 kDebug( 6050 ) << indent <<
"saveState this=" <<
this <<
" '" << objectName() <<
"' saving URL " <<
url().
url();
5396 stream <<
url() << (
qint32)d->m_view->contentsX() << (
qint32)d->m_view->contentsY()
5397 << (
qint32) d->m_view->contentsWidth() << (
qint32) d->m_view->contentsHeight() << (
qint32) d->m_view->marginWidth() << (
qint32) d->m_view->marginHeight();
5400 int focusNodeNumber;
5401 if (!d->m_focusNodeRestored)
5402 focusNodeNumber = d->m_focusNodeNumber;
5403 else if (d->m_doc && d->m_doc->focusNode())
5404 focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
5406 focusNodeNumber = -1;
5407 stream << focusNodeNumber;
5410 stream << d->m_cacheId;
5416 docState = d->m_doc->docState();
5418 stream << d->m_encoding << d->m_sheetUsed << docState;
5420 stream << d->m_zoomFactor;
5421 stream << d->m_fontScaleFactor;
5423 stream << d->m_httpHeaders;
5424 stream << d->m_pageServices;
5425 stream << d->m_pageReferrer;
5428 stream << d->m_ssl_in_use
5429 << d->m_ssl_peer_chain
5432 << d->m_ssl_protocol_version
5433 << d->m_ssl_cipher_used_bits
5434 << d->m_ssl_cipher_bits
5435 << d->m_ssl_cert_errors
5436 << d->m_ssl_parent_ip
5437 << d->m_ssl_parent_cert;
5440 QStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
5447 for (; it !=
end; ++it )
5449 if ( !(*it)->m_part )
5452 frameNameLst << (*it)->m_name;
5453 frameServiceTypeLst << (*it)->m_serviceType;
5454 frameServiceNameLst << (*it)->m_serviceName;
5455 frameURLLst << (*it)->m_part.data()->url();
5458 QDataStream frameStream( &state, QIODevice::WriteOnly );
5460 if ( (*it)->m_extension )
5461 (*it)->m_extension.data()->saveState( frameStream );
5463 frameStateBufferLst << state;
5465 frameTypeLst << int( (*it)->m_type );
5469 stream << (
quint32) frameNameLst.count();
5470 stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst << frameTypeLst;
5471 #ifdef DEBUG_SAVESTATE
5472 s_saveStateIndentLevel = indentLevel;
5479 qint32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
5487 long old_cacheId = d->m_cacheId;
5489 stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
5491 d->m_view->setMarginWidth( mWidth );
5492 d->m_view->setMarginHeight( mHeight );
5496 stream >> d->m_focusNodeNumber;
5497 d->m_focusNodeRestored =
false;
5499 stream >> d->m_cacheId;
5501 stream >> encoding >> sheetUsed >> docState;
5504 d->m_sheetUsed = sheetUsed;
5514 stream >> d->m_httpHeaders;
5515 stream >> d->m_pageServices;
5516 stream >> d->m_pageReferrer;
5519 stream >> d->m_ssl_in_use
5520 >> d->m_ssl_peer_chain
5523 >> d->m_ssl_protocol_version
5524 >> d->m_ssl_cipher_used_bits
5525 >> d->m_ssl_cipher_bits
5526 >> d->m_ssl_cert_errors
5527 >> d->m_ssl_parent_ip
5528 >> d->m_ssl_parent_cert;
5532 stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
5533 >> frameURLs >> frameStateBuffers >> frameTypes;
5535 d->m_bComplete =
false;
5536 d->m_bLoadEventEmitted =
false;
5542 if (d->m_cacheId == old_cacheId &&
signed(frameCount) == d->m_frames.count())
5545 d->m_redirectionTimer.stop();
5547 FrameIt fIt = d->m_frames.begin();
5548 const FrameIt fEnd = d->m_frames.end();
5550 for (; fIt != fEnd; ++fIt )
5551 (*fIt)->m_bCompleted =
false;
5553 fIt = d->m_frames.begin();
5555 QStringList::ConstIterator fNameIt = frameNames.constBegin();
5556 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.constBegin();
5557 QStringList::ConstIterator fServiceNameIt = frameServiceNames.constBegin();
5558 KUrl::List::ConstIterator fURLIt = frameURLs.constBegin();
5562 for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt, ++fFrameTypeIt )
5571 child->
m_name = *fNameIt;
5574 processObjectRequest( child, *fURLIt, *fServiceTypeIt );
5579 if ( child->
m_extension && !(*fBufferIt).isEmpty() )
5581 QDataStream frameStream( *fBufferIt );
5582 child->
m_extension.data()->restoreState( frameStream );
5585 child->
m_part.data()->openUrl( *fURLIt );
5596 d->m_extension->setBrowserArguments(browserArgs);
5598 d->m_view->resizeContents( wContents, hContents );
5599 d->m_view->setContentsPos( xOffset, yOffset );
5609 d->m_bCleared =
false;
5612 d->m_sheetUsed = sheetUsed;
5614 QStringList::ConstIterator fNameIt = frameNames.constBegin();
5615 const QStringList::ConstIterator fNameEnd = frameNames.constEnd();
5617 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.constBegin();
5618 QStringList::ConstIterator fServiceNameIt = frameServiceNames.constBegin();
5619 KUrl::List::ConstIterator fURLIt = frameURLs.constBegin();
5623 for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt, ++fFrameTypeIt )
5627 newChild->
m_name = *fNameIt;
5633 const FrameIt childFrame = d->m_frames.insert( d->m_frames.end(), newChild );
5635 processObjectRequest( *childFrame, *fURLIt, *fServiceTypeIt );
5637 (*childFrame)->m_bPreloaded =
true;
5639 if ( (*childFrame)->m_part )
5641 if ( (*childFrame)->m_extension && !(*fBufferIt).isEmpty() )
5643 QDataStream frameStream( *fBufferIt );
5644 (*childFrame)->m_extension.data()->restoreState( frameStream );
5647 (*childFrame)->m_part.data()->openUrl( *fURLIt );
5658 d->m_extension->setBrowserArguments(browserArgs);
5662 d->m_restored =
true;
5664 d->m_restored =
false;
5688 return d->m_view->nodeUnderMouse();
5693 return d->m_view->nonSharedNodeUnderMouse();
5696 void KHTMLPart::emitSelectionChanged()
5700 if (!d->m_activeFrame)
5702 emit d->m_extension->enableAction(
"copy",
hasSelection() );
5710 return d->m_zoomFactor;
5714 static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
5723 void KHTMLPart::slotIncZoom()
5725 zoomIn(zoomSizes, zoomSizeCount);
5728 void KHTMLPart::slotDecZoom()
5730 zoomOut(zoomSizes, zoomSizeCount);
5733 void KHTMLPart::slotIncZoomFast()
5735 zoomIn(fastZoomSizes, fastZoomSizeCount);
5738 void KHTMLPart::slotDecZoomFast()
5740 zoomOut(fastZoomSizes, fastZoomSizeCount);
5743 void KHTMLPart::zoomIn(
const int stepping[],
int count)
5747 if (zoomFactor < maxZoom) {
5749 for (
int i = 0; i < count; ++i)
5750 if (stepping[i] > zoomFactor) {
5751 zoomFactor = stepping[i];
5758 void KHTMLPart::zoomOut(
const int stepping[],
int count)
5760 int zoomFactor = d->m_zoomFactor;
5761 if (zoomFactor > minZoom) {
5763 for (
int i = count-1; i >= 0; --i)
5764 if (stepping[i] < zoomFactor) {
5765 zoomFactor = stepping[i];
5776 if (percent < 100) percent = 100;
5779 if (percent > maxZoom) percent =
maxZoom;
5780 if (d->m_zoomFactor == percent)
return;
5781 d->m_zoomFactor = percent;
5790 QApplication::setOverrideCursor( Qt::WaitCursor );
5791 d->m_view->setZoomLevel( d->m_zoomFactor );
5792 QApplication::restoreOverrideCursor();
5797 for (; it !=
end; ++it ) {
5798 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5803 d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
5804 d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
5808 void KHTMLPart::slotIncFontSize()
5810 incFontSize(zoomSizes, zoomSizeCount);
5813 void KHTMLPart::slotDecFontSize()
5815 decFontSize(zoomSizes, zoomSizeCount);
5818 void KHTMLPart::slotIncFontSizeFast()
5820 incFontSize(fastZoomSizes, fastZoomSizeCount);
5823 void KHTMLPart::slotDecFontSizeFast()
5825 decFontSize(fastZoomSizes, fastZoomSizeCount);
5828 void KHTMLPart::incFontSize(
const int stepping[],
int count)
5830 int zoomFactor = d->m_fontScaleFactor;
5832 if (zoomFactor < maxZoom) {
5834 for (
int i = 0; i < count; ++i)
5835 if (stepping[i] > zoomFactor) {
5836 zoomFactor = stepping[i];
5843 void KHTMLPart::decFontSize(
const int stepping[],
int count)
5845 int zoomFactor = d->m_fontScaleFactor;
5846 if (zoomFactor > minZoom) {
5848 for (
int i = count-1; i >= 0; --i)
5849 if (stepping[i] < zoomFactor) {
5850 zoomFactor = stepping[i];
5859 if (percent < minZoom) percent =
minZoom;
5860 if (percent > maxZoom) percent =
maxZoom;
5861 if (d->m_fontScaleFactor == percent)
return;
5862 d->m_fontScaleFactor = percent;
5864 if (d->m_view && d->m_doc) {
5865 QApplication::setOverrideCursor( Qt::WaitCursor );
5866 if (d->m_doc->styleSelector())
5867 d->m_doc->styleSelector()->computeFontSizes(d->m_doc->logicalDpiY(), d->m_fontScaleFactor);
5868 d->m_doc->recalcStyle( NodeImpl::Force );
5869 QApplication::restoreOverrideCursor();
5874 for (; it !=
end; ++it ) {
5875 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5882 return d->m_fontScaleFactor;
5885 void KHTMLPart::slotZoomView(
int delta )
5893 void KHTMLPart::setStatusBarText(
const QString& text, StatusBarPriority p)
5895 if (!d->m_statusMessagesEnabled)
5898 d->m_statusBarText[p] = text;
5901 QString tobe = d->m_statusBarText[BarHoverText];
5903 tobe = d->m_statusBarText[BarOverrideText];
5904 if (tobe.isEmpty()) {
5905 tobe = d->m_statusBarText[BarDefaultText];
5906 if (!tobe.isEmpty() && d->m_jobspeed)
5909 tobe +=
i18n(
"(%1/s)" , KIO::convertSize( d->m_jobspeed ) );
5913 emit ReadOnlyPart::setStatusBarText(tobe);
5919 setStatusBarText(text, BarOverrideText);
5924 setStatusBarText(text, BarDefaultText);
5929 return d->m_statusBarText[BarOverrideText];
5934 return d->m_statusBarText[BarDefaultText];
5939 return d->m_referrer;
5944 KUrl referrerURL =
KUrl( d->m_pageReferrer );
5945 if (referrerURL.isValid())
5949 if ((protocol ==
"http") ||
5950 ((protocol ==
"https") && (
url().protocol() ==
"https")))
5955 return referrerURL.
url();
5969 QDateTime lastModif = QFileInfo(
url().toLocalFile() ).lastModified();
5970 d->m_lastModified = lastModif.toString( Qt::LocalDate );
5973 return d->m_lastModified;
5976 void KHTMLPart::slotLoadImages()
5979 d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
5983 for (; it !=
end; ++it ) {
5984 if (
KHTMLPart* p = qobject_cast<KHTMLPart*>((*it)->m_part.data()) )
5985 p->slotLoadImages();
5989 void KHTMLPart::reparseConfiguration()
5996 d->m_doc->docLoader()->setShowAnimations( settings->
showAnimations() );
6005 delete d->m_settings;
6008 QApplication::setOverrideCursor( Qt::WaitCursor );
6009 khtml::CSSStyleSelector::reparseConfiguration();
6010 if(d->m_doc) d->m_doc->updateStyleSelector();
6011 QApplication::restoreOverrideCursor();
6033 for (; it !=
end; ++it )
6034 if (!(*it)->m_bPreloaded && (*it)->m_part)
6035 res += (*it)->m_name;
6046 for (; it !=
end; ++it )
6047 if (!(*it)->m_bPreloaded && (*it)->m_part)
6049 res.append( (*it)->m_part.data() );
6059 if ( it == d->m_frames.end() )
6064 emit d->m_extension->openUrlNotify();
6066 requestObject( *it, url, args, browserArgs );
6119 if (d->editor_context.m_selection.state() == Selection::CARET)
6121 if (!xmlDocImpl()->renderer())
6124 khtml::RenderObject::NodeInfo nodeInfo(
true,
true);
6125 xmlDocImpl()->renderer()->layer()->nodeAtPoint(nodeInfo, x, y);
6126 NodeImpl *innerNode = nodeInfo.innerNode();
6127 if (!innerNode || !innerNode->renderer())
6130 return innerNode->isPointInsideSelection(x, y, d->editor_context.m_selection);
6138 static bool firstRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&startNode,
long &startOffset)
6140 for (khtml::RenderObject *n = renderNode; n; n = n->nextSibling()) {
6142 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
6143 for (khtml::InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
6144 if (box->m_y == y && textRenderer->element()) {
6145 startNode = textRenderer->element();
6146 startOffset = box->m_start;
6152 if (
firstRunAt(n->firstChild(), y, startNode, startOffset)) {
6165 static bool lastRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&endNode,
long &endOffset)
6167 khtml::RenderObject *n = renderNode;
6171 khtml::RenderObject *
next;
6172 while ((next = n->nextSibling())) {
6177 if (
lastRunAt(n->firstChild(), y, endNode, endOffset)) {
6182 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
6183 for (khtml::InlineTextBox* box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
6184 if (box->m_y == y && textRenderer->element()) {
6185 endNode = textRenderer->element();
6186 endOffset = box->m_start + box->m_len;
6192 if (n == renderNode) {
6196 n = n->previousSibling();
6202 QMouseEvent *mouse =
event->qmouseEvent();
6203 DOM::Node innerNode =
event->innerNode();
6207 if (mouse->button() == Qt::LeftButton && !innerNode.
isNull() && innerNode.
handle()->renderer() &&
6208 innerNode.
handle()->renderer()->shouldSelect()) {
6209 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6210 if (pos.node() && (pos.node()->nodeType() == Node::TEXT_NODE || pos.node()->nodeType() == Node::CDATA_SECTION_NODE)) {
6211 selection.moveTo(pos);
6212 selection.expandUsingGranularity(Selection::WORD);
6216 if (selection.state() != Selection::CARET) {
6217 d->editor_context.beginSelectingText(Selection::WORD);
6220 setCaret(selection);
6226 QMouseEvent *mouse =
event->qmouseEvent();
6227 DOM::Node innerNode =
event->innerNode();
6231 if (mouse->button() == Qt::LeftButton && !innerNode.
isNull() && innerNode.
handle()->renderer() &&
6232 innerNode.
handle()->renderer()->shouldSelect()) {
6233 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6234 if (pos.node() && (pos.node()->nodeType() == Node::TEXT_NODE || pos.node()->nodeType() == Node::CDATA_SECTION_NODE)) {
6235 selection.moveTo(pos);
6236 selection.expandUsingGranularity(Selection::LINE);
6240 if (selection.state() != Selection::CARET) {
6241 d->editor_context.beginSelectingText(Selection::LINE);
6244 setCaret(selection);
6250 QMouseEvent *mouse =
event->qmouseEvent();
6251 DOM::Node innerNode =
event->innerNode();
6253 if (mouse->button() == Qt::LeftButton) {
6256 if (!innerNode.
isNull() && innerNode.
handle()->renderer() &&
6257 innerNode.
handle()->renderer()->shouldSelect()) {
6258 bool extendSelection = mouse->modifiers() & Qt::ShiftModifier;
6265 Position pos(innerNode.
handle()->positionForCoordinates(event->
x(),
event->y()).position());
6267 pos = Position(innerNode.
handle(), innerNode.
handle()->caretMinOffset());
6268 kDebug(6050) <<
event->x() <<
event->y() << pos << endl;
6271 if (extendSelection && sel.notEmpty()) {
6272 sel.clearModifyBias();
6274 if (d->editor_context.m_selectionGranularity != Selection::CHARACTER) {
6275 sel.expandUsingGranularity(d->editor_context.m_selectionGranularity);
6277 d->editor_context.m_beganSelectingText =
true;
6280 d->editor_context.m_selectionGranularity = Selection::CHARACTER;
6292 QMouseEvent *_mouse =
event->qmouseEvent();
6293 DOM::Node innerNode =
event->innerNode();
6294 d->m_mousePressNode = innerNode;
6296 d->m_dragStartPos =
QPoint(event->
x(),
event->y());
6299 d->m_strSelectedURL =
event->url().string();
6300 d->m_strSelectedURLTarget =
event->target().string();
6303 d->m_strSelectedURL.clear();
6304 d->m_strSelectedURLTarget.clear();
6307 if ( _mouse->button() == Qt::LeftButton ||
6308 _mouse->button() == Qt::MidButton )
6310 d->m_bMousePressed =
true;
6312 #ifdef KHTML_NO_SELECTION
6313 d->m_dragLastPos = _mouse->globalPos();
6315 if ( _mouse->button() == Qt::LeftButton )
6317 if ( (!d->m_strSelectedURL.isNull() && !
isEditable())
6318 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) )
6321 d->editor_context.m_beganSelectingText =
false;
6323 handleMousePressEventSingleClick(event);
6328 if ( _mouse->button() == Qt::RightButton )
6337 QMouseEvent *_mouse =
event->qmouseEvent();
6338 if ( _mouse->button() == Qt::LeftButton )
6340 d->m_bMousePressed =
true;
6341 d->editor_context.m_beganSelectingText =
false;
6344 handleMousePressEventDoubleClick(event);
6349 handleMousePressEventTripleClick(event);
6355 #ifndef KHTML_NO_SELECTION
6356 bool KHTMLPart::isExtendingSelection()
const
6361 return d->editor_context.m_beganSelectingText;
6364 void KHTMLPart::extendSelectionTo(
int x,
int y,
const DOM::Node &innerNode)
6367 Position pos(innerNode.
handle()->positionForCoordinates(x, y).position());
6375 Selection sel = caret();
6376 sel.clearModifyBias();
6377 if (!d->editor_context.m_beganSelectingText) {
6380 d->editor_context.beginSelectingText(Selection::CHARACTER);
6385 if (d->editor_context.m_selectionGranularity != Selection::CHARACTER) {
6386 sel.expandUsingGranularity(d->editor_context.m_selectionGranularity);
6391 #endif // KHTML_NO_SELECTION
6395 #ifdef QT_NO_DRAGANDDROP
6401 DOM::Node innerNode =
event->innerNode();
6403 if( (d->m_bMousePressed &&
6404 ( (!d->m_strSelectedURL.isEmpty() && !
isEditable())
6405 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) ) )
6411 HTMLImageElementImpl *img = 0L;
6420 img =
static_cast<HTMLImageElementImpl *
>(innerNode.
handle());
6421 u =
KUrl(
completeURL( khtml::parseURL(img->getAttribute(ATTR_SRC)).
string() ) );
6433 QDrag *drag =
new QDrag( d->m_view->viewport() );
6435 if ( !d->m_referrer.isEmpty() )
6436 metaDataMap.insert(
"referrer", d->m_referrer );
6437 QMimeData* mimeData =
new QMimeData();
6439 drag->setMimeData( mimeData );
6441 if( img && img->complete() )
6442 drag->mimeData()->setImageData( img->currentImage() );
6444 if ( !pix.isNull() )
6445 drag->setPixmap( pix );
6451 d->m_bMousePressed =
false;
6452 d->m_strSelectedURL.clear();
6453 d->m_strSelectedURLTarget.clear();
6457 #endif // QT_NO_DRAGANDDROP
6463 if ( d->m_bMousePressed )
return false;
6471 QMouseEvent *_mouse =
event->qmouseEvent();
6472 DOM::Node innerNode =
event->innerNode();
6474 bool shiftPressed = ( _mouse->modifiers() & Qt::ShiftModifier );
6479 HTMLImageElementImpl *i =
static_cast<HTMLImageElementImpl *
>(innerNode.
handle());
6480 if ( i && i->isServerMap() )
6482 khtml::RenderObject *r = i->renderer();
6486 r->absolutePosition(absx, absy);
6487 int x(event->
x() - absx), y(event->
y() - absy);
6489 d->m_overURL = url.
string() +
QString(
"?%1,%2").arg(x).arg(y);
6490 d->m_overURLTarget = target.
string();
6491 overURL( d->m_overURL, target.
string(), shiftPressed );
6498 if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
6500 d->m_overURL = url.
string();
6501 d->m_overURLTarget = target.
string();
6502 overURL( d->m_overURL, target.
string(), shiftPressed );
6507 if( !d->m_overURL.isEmpty() )
6519 if (!d->m_bMousePressed)
6522 #ifdef KHTML_NO_SELECTION
6523 if (d->m_doc && d->m_view) {
6524 QPoint diff( mouse->globalPos() - d->m_dragLastPos );
6526 if (abs(diff.x()) > 64 || abs(diff.y()) > 64) {
6527 d->m_view->scrollBy(-diff.x(), -diff.y());
6528 d->m_dragLastPos = mouse->globalPos();
6533 QMouseEvent *mouse =
event->qmouseEvent();
6534 DOM::Node innerNode =
event->innerNode();
6536 if ( (mouse->buttons() & Qt::LeftButton) == 0 || !innerNode.
handle() || !innerNode.
handle()->renderer() ||
6537 !innerNode.
handle()->renderer()->shouldSelect())
6541 extendSelectionTo(event->
x(),
event->y(), innerNode);
6542 #endif // KHTML_NO_SELECTION
6547 if (handleMouseMoveEventDrag(event))
6550 if (handleMouseMoveEventOver(event))
6553 handleMouseMoveEventSelection(event);
6558 DOM::Node innerNode =
event->innerNode();
6561 if ( d->m_bMousePressed ) {
6562 setStatusBarText(
QString(), BarHoverText);
6568 d->m_bMousePressed =
false;
6570 #ifndef QT_NO_CLIPBOARD
6571 QMouseEvent *_mouse =
event->qmouseEvent();
6573 kDebug( 6050 ) <<
"MMB shouldOpen=" << d->m_bOpenMiddleClick;
6575 if (d->m_bOpenMiddleClick) {
6583 #ifndef KHTML_NO_SELECTION
6589 if (!d->editor_context.m_beganSelectingText
6590 && d->m_dragStartPos.x() ==
event->x()
6591 && d->m_dragStartPos.y() ==
event->y()
6592 && d->editor_context.m_selection.state() == Selection::RANGE) {
6594 #ifdef APPLE_CHANGES
6595 if (d->editor_context.m_selection.base().node()->isContentEditable())
6597 selection.moveTo(d->editor_context.m_selection.base().node()->positionForCoordinates(event->
x(),
event->y()).position());
6598 setCaret(selection);
6601 #ifndef QT_NO_CLIPBOARD
6603 text.replace(QChar(0xa0),
' ');
6604 if (!text.isEmpty()) {
6605 disconnect( qApp->clipboard(), SIGNAL(
selectionChanged()),
this, SLOT(slotClearSelection()));
6606 qApp->clipboard()->setText(text,QClipboard::Selection);
6607 connect( qApp->clipboard(), SIGNAL(
selectionChanged()), SLOT(slotClearSelection()));
6611 emitSelectionChanged();
6625 emitSelectionChanged();
6626 emit d->m_extension->enableAction(
"print", d->m_doc != 0 );
6628 if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
6631 lst.append( d->m_paLoadImages );
6637 void KHTMLPart::slotPrintFrame()
6639 if ( d->m_frames.count() == 0 )
6652 const QMetaObject *mo = ext->metaObject();
6655 if (mo->indexOfSlot(
"print()") != -1)
6656 QMetaObject::invokeMethod(ext,
"print()", Qt::DirectConnection);
6659 void KHTMLPart::slotSelectAll()
6662 if (part && part->inherits(
"KHTMLPart"))
6663 static_cast<KHTMLPart *>(part)->selectAll();
6666 void KHTMLPart::startAutoScroll()
6668 connect(&d->m_scrollTimer, SIGNAL(
timeout()),
this, SLOT(slotAutoScroll()));
6669 d->m_scrollTimer.setSingleShot(
false);
6670 d->m_scrollTimer.start(100);
6673 void KHTMLPart::stopAutoScroll()
6675 disconnect(&d->m_scrollTimer, SIGNAL(
timeout()),
this, SLOT(slotAutoScroll()));
6676 if (d->m_scrollTimer.isActive())
6677 d->m_scrollTimer.stop();
6681 void KHTMLPart::slotAutoScroll()
6684 d->m_view->doAutoScroll();
6689 void KHTMLPart::runAdFilter()
6697 QSetIterator<khtml::CachedObject*> it( d->m_doc->docLoader()->m_docObjects );
6698 while (it.hasNext())
6700 khtml::CachedObject* obj = it.next();
6701 if ( obj->type() == khtml::CachedObject::Image ) {
6702 khtml::CachedImage *image =
static_cast<khtml::CachedImage *
>(obj);
6703 bool wasBlocked = image->m_wasBlocked;
6705 if ( image->m_wasBlocked != wasBlocked )
6706 image->do_notify(
QRect(
QPoint(0,0), image->pixmap_size()));
6711 for ( NodeImpl *nextNode, *node = d->m_doc; node; node = nextNode ) {
6714 nextNode = node->traverseNextNode();
6716 if ( node->id() == ID_IMG ||
6717 node->id() == ID_IFRAME ||
6718 (node->id() == ID_INPUT &&
static_cast<HTMLInputElementImpl *
>(node)->inputType() == HTMLInputElementImpl::IMAGE ))
6724 while (nextNode && nextNode->isAncestor(node))
6725 nextNode = nextNode->traverseNextNode();
6728 NodeImpl *parent = node->parent();
6732 parent->removeChild(node, exception);
6743 if (!d->m_doc)
return;
6746 if (d->m_doc->isHTMLDocument())
6747 first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6754 while ( first && !(first->renderer()
6755 && ((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE)
6756 || (first->renderer()->isReplaced() && !first->renderer()->firstChild()))))
6758 next = first->firstChild();
6759 if ( !next ) next = first->nextSibling();
6760 while( first && !next )
6762 first = first->parentNode();
6764 next = first->nextSibling();
6770 if (d->m_doc->isHTMLDocument())
6771 last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6778 while ( last && !(last->renderer()
6779 && ((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE)
6780 || (last->renderer()->isReplaced() && !last->renderer()->lastChild()))))
6782 next = last->lastChild();
6783 if ( !next ) next = last->previousSibling();
6784 while ( last && !next )
6786 last = last->parentNode();
6788 next = last->previousSibling();
6793 if ( !first || !last )
6795 Q_ASSERT(first->renderer());
6796 Q_ASSERT(last->renderer());
6797 d->editor_context.m_selection.moveTo(Position(first, 0), Position(last, last->nodeValue().length()));
6798 d->m_doc->updateSelection();
6800 emitSelectionChanged();
6805 bool linkAllowed =
true;
6808 linkAllowed = KAuthorized::authorizeUrlAction(
"redirect",
url(), linkURL);
6810 if ( !linkAllowed ) {
6811 khtml::Tokenizer *tokenizer = d->m_doc->tokenizer();
6813 tokenizer->setOnHold(
true);
6821 i18n(
"Security Warning" ),
6823 KStandardGuiItem::cancel(),
6830 i18n(
"<qt>Access by untrusted page to<br /><b>%1</b><br /> denied.</qt>", Qt::escape(linkURL.
prettyUrl())),
6831 i18n(
"Security Alert" ));
6835 tokenizer->setOnHold(
false);
6844 if ( part == d->m_activeFrame )
6846 d->m_activeFrame = 0L;
6847 if ( !part->inherits(
"KHTMLPart" ) )
6859 void KHTMLPart::slotActiveFrameChanged(
KParts::Part *part )
6864 kError(6050) <<
"strange error! we activated ourselves";
6869 if ( d->m_activeFrame && d->m_activeFrame->widget() && d->m_activeFrame->widget()->inherits(
"QFrame" ) )
6871 QFrame *frame =
static_cast<QFrame *
>( d->m_activeFrame->widget() );
6872 if (frame->frameStyle() != QFrame::NoFrame)
6874 frame->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken);
6879 if( d->m_activeFrame && !d->m_activeFrame->inherits(
"KHTMLPart" ) )
6886 if( part && !part->inherits(
"KHTMLPart" ) )
6895 d->m_activeFrame = part;
6897 if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits(
"QFrame" ) )
6899 QFrame *frame =
static_cast<QFrame *
>( d->m_activeFrame->widget() );
6900 if (frame->frameStyle() != QFrame::NoFrame)
6902 frame->setFrameStyle( QFrame::StyledPanel | QFrame::Plain);
6905 kDebug(6050) <<
"new active frame " << d->m_activeFrame;
6916 if (!d->m_doc || !d->m_view)
6920 d->m_doc->setFocusNode(node.
handle());
6924 d->m_view->ensureVisible(rect.right(), rect.bottom());
6925 d->m_view->ensureVisible(rect.left(), rect.top());
6930 return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
6940 return proxy->createHTMLEventHandler(
url().
url(), name, code, node, svg );
6948 void KHTMLPart::setOpener(
KHTMLPart *_opener)
6950 d->m_opener = _opener;
6953 bool KHTMLPart::openedByJS()
6955 return d->m_openedByJS;
6958 void KHTMLPart::setOpenedByJS(
bool _openedByJS)
6960 d->m_openedByJS = _openedByJS;
6965 khtml::Cache::preloadStyleSheet(url, stylesheet);
6970 khtml::Cache::preloadScript(url, script);
6973 long KHTMLPart::cacheId()
const
6975 return d->m_cacheId;
6980 return d->m_restored;
6990 return d->m_pluginPageQuestionAsked.contains(mimetype);
6998 d->m_pluginPageQuestionAsked.append(mimetype);
7004 if( !d->m_encoding.isNull() )
7005 dec->
setEncoding( d->m_encoding.toLatin1().constData(),
7015 d->m_doc->setDecoder(dec);
7020 void KHTMLPart::emitCaretPositionChanged(
const DOM::Position &pos) {
7022 Position rng_pos = pos.equivalentRangeCompliantPosition();
7023 Node node = rng_pos.node();
7027 void KHTMLPart::restoreScrollPosition()
7031 if (
url().hasRef() && !d->m_restoreScrollPosition && !args.
reload()) {
7032 if ( !d->m_doc || !d->m_doc->parsing() )
7033 disconnect(d->m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
7043 if (d->m_view->contentsHeight() - d->m_view->visibleHeight() >= args.
yOffset()
7044 || d->m_bComplete) {
7046 disconnect(d->m_view, SIGNAL(finishedLayout()),
this, SLOT(restoreScrollPosition()));
7051 void KHTMLPart::openWallet(DOM::HTMLFormElementImpl *form)
7053 #ifndef KHTML_NO_WALLET
7060 p->openWallet(form);
7069 if (d->m_bWalletOpened) {
7070 if (d->m_wallet->isOpen()) {
7071 form->walletOpened(d->m_wallet);
7074 d->m_wallet->deleteLater();
7076 d->m_bWalletOpened =
false;
7083 d->m_wq->wallet = wallet;
7084 connect(wallet, SIGNAL(walletOpened(
bool)), d->m_wq, SLOT(walletOpened(
bool)));
7089 #endif // KHTML_NO_WALLET
7095 #ifndef KHTML_NO_WALLET
7102 p->saveToWallet(key, data);
7107 if (d->m_bWalletOpened) {
7108 if (d->m_wallet->isOpen()) {
7113 d->m_wallet->writeMap(key, data);
7116 d->m_wallet->deleteLater();
7118 d->m_bWalletOpened =
false;
7125 d->m_wq->wallet = wallet;
7126 connect(wallet, SIGNAL(walletOpened(
bool)), d->m_wq, SLOT(walletOpened(
bool)));
7129 d->m_wq->savers.append(qMakePair(key, data));
7130 #endif // KHTML_NO_WALLET
7134 void KHTMLPart::dequeueWallet(DOM::HTMLFormElementImpl *form) {
7135 #ifndef KHTML_NO_WALLET
7142 p->dequeueWallet(form);
7149 #endif // KHTML_NO_WALLET
7154 #ifndef KHTML_NO_WALLET
7158 d->m_wq->deleteLater();
7162 d->m_bWalletOpened =
false;
7166 d->m_wallet = wallet;
7167 d->m_bWalletOpened =
true;
7168 connect(d->m_wallet, SIGNAL(walletClosed()), SLOT(slotWalletClosed()));
7169 d->m_walletForms.clear();
7170 if (!d->m_statusBarWalletLabel) {
7171 d->m_statusBarWalletLabel =
new KUrlLabel(d->m_statusBarExtension->statusBar());
7172 d->m_statusBarWalletLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum));
7174 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarWalletLabel, 0,
false);
7175 d->m_statusBarWalletLabel->setPixmap(
SmallIcon(
"wallet-open"));
7176 connect(d->m_statusBarWalletLabel, SIGNAL(leftClickedUrl()), SLOT(launchWalletManager()));
7177 connect(d->m_statusBarWalletLabel, SIGNAL(rightClickedUrl()), SLOT(walletMenu()));
7180 #endif // KHTML_NO_WALLET
7186 #ifndef KHTML_NO_WALLET
7198 #endif // !KHTML_NO_WALLET
7202 void KHTMLPart::slotWalletClosed()
7204 #ifndef KHTML_NO_WALLET
7206 d->m_wallet->deleteLater();
7209 d->m_bWalletOpened =
false;
7210 if (d->m_statusBarWalletLabel) {
7211 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarWalletLabel);
7212 delete d->m_statusBarWalletLabel;
7213 d->m_statusBarWalletLabel = 0L;
7215 #endif // KHTML_NO_WALLET
7218 void KHTMLPart::launchWalletManager()
7220 #ifndef KHTML_NO_WALLET
7221 QDBusInterface r(
"org.kde.kwalletmanager",
"/kwalletmanager/MainWindow_1",
7222 "org.kde.KMainWindow");
7226 r.call(QDBus::NoBlock,
"show");
7227 r.call(QDBus::NoBlock,
"raise");
7229 #endif // KHTML_NO_WALLET
7232 void KHTMLPart::walletMenu()
7234 #ifndef KHTML_NO_WALLET
7236 QActionGroup *menuActionGroup =
new QActionGroup(menu);
7237 connect( menuActionGroup, SIGNAL(triggered(
QAction*)),
this, SLOT(removeStoredPasswordForm(
QAction*)) );
7239 menu->addAction(
i18n(
"&Close Wallet"),
this, SLOT(slotWalletClosed()));
7241 if (d->m_view && d->m_view->nonPasswordStorableSite(
toplevelURL().host())) {
7242 menu->addAction(
i18n(
"&Allow storing passwords for this site"),
this, SLOT(delNonPasswordStorableSite()));
7246 for ( QStringList::ConstIterator it = d->m_walletForms.constBegin(); it != d->m_walletForms.constEnd(); ++it ) {
7247 QAction* action = menu->addAction(
i18n(
"Remove password for form %1", *it) );
7248 action->setActionGroup(menuActionGroup);
7250 action->setData(var);
7254 menu->popup(QCursor::pos());
7255 #endif // KHTML_NO_WALLET
7258 void KHTMLPart::removeStoredPasswordForm(
QAction* action)
7260 #ifndef KHTML_NO_WALLET
7279 if (d->m_wallet->removeEntry(key))
7282 d->m_walletForms.removeAll(key);
7283 #endif // KHTML_NO_WALLET
7286 void KHTMLPart::addWalletFormKey(
const QString& walletFormKey)
7288 #ifndef KHTML_NO_WALLET
7291 parentPart()->addWalletFormKey(walletFormKey);
7295 if(!d->m_walletForms.contains(walletFormKey))
7296 d->m_walletForms.append(walletFormKey);
7297 #endif // KHTML_NO_WALLET
7300 void KHTMLPart::delNonPasswordStorableSite()
7302 #ifndef KHTML_NO_WALLET
7304 d->m_view->delNonPasswordStorableSite(
toplevelURL().host());
7305 #endif // KHTML_NO_WALLET
7309 #ifndef KHTML_NO_WALLET
7310 d->m_storePass.saveLoginInformation(host, key, walletMap);
7311 #endif // KHTML_NO_WALLET
7314 void KHTMLPart::slotToggleCaretMode()
7320 d->m_formNotification = fn;
7324 return d->m_formNotification;
7344 return d->m_doc->unsubmittedFormChanges();
7347 void KHTMLPart::setDebugScript(
bool enable )
7351 if (!d->m_paDebugScript) {
7352 d->m_paDebugScript =
new KAction(
i18n(
"JavaScript &Debugger" ),
this );
7354 connect( d->m_paDebugScript, SIGNAL(triggered(
bool)),
this, SLOT(slotDebugScript()) );
7356 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
7358 lst.append( d->m_paDebugScript );
7361 d->m_bJScriptDebugEnabled = enable;
7371 if ( enable && originPart ) {
7372 d->m_openableSuppressedPopups++;
7373 if ( d->m_suppressedPopupOriginParts.indexOf( originPart ) == -1 )
7374 d->m_suppressedPopupOriginParts.append( originPart );
7377 if ( enable && !d->m_statusBarPopupLabel ) {
7378 d->m_statusBarPopupLabel =
new KUrlLabel( d->m_statusBarExtension->statusBar() );
7379 d->m_statusBarPopupLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum ));
7381 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarPopupLabel, 0,
false );
7382 d->m_statusBarPopupLabel->setPixmap(
SmallIcon(
"window-suppressed") );
7384 d->m_statusBarPopupLabel->setToolTip(
i18n(
"This page was prevented from opening a new window via JavaScript." ) );
7386 connect(d->m_statusBarPopupLabel, SIGNAL(leftClickedUrl()), SLOT(suppressedPopupMenu()));
7387 if (d->m_settings->jsPopupBlockerPassivePopup()) {
7390 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);
7392 }
else if ( !enable && d->m_statusBarPopupLabel ) {
7393 d->m_statusBarPopupLabel->setToolTip(
"" );
7394 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarPopupLabel );
7395 delete d->m_statusBarPopupLabel;
7396 d->m_statusBarPopupLabel = 0L;
7400 void KHTMLPart::suppressedPopupMenu() {
7402 if ( d->m_openableSuppressedPopups )
7403 m->addAction(
i18np(
"&Show Blocked Popup Window",
"&Show %1 Blocked Popup Windows", d->m_openableSuppressedPopups),
this, SLOT(showSuppressedPopups()));
7404 QAction *a = m->addAction(
i18n(
"Show Blocked Window Passive Popup &Notification"),
this, SLOT(togglePopupPassivePopup()));
7405 a->setChecked(d->m_settings->jsPopupBlockerPassivePopup());
7406 m->addAction(
i18n(
"&Configure JavaScript New Window Policies..."),
this, SLOT(launchJSConfigDialog()));
7407 m->popup(QCursor::pos());
7410 void KHTMLPart::togglePopupPassivePopup() {
7412 d->m_settings->setJSPopupBlockerPassivePopup( !d->m_settings->jsPopupBlockerPassivePopup() );
7416 void KHTMLPart::showSuppressedPopups() {
7417 foreach (
KHTMLPart* part, d->m_suppressedPopupOriginParts ) {
7419 KJS::Window *w = KJS::Window::retrieveWindow( part );
7421 w->showSuppressedWindows();
7422 w->forgetSuppressedWindows();
7427 d->m_openableSuppressedPopups = 0;
7428 d->m_suppressedPopupOriginParts.clear();
7433 QString KHTMLPart::defaultExtension()
const
7437 if ( !d->m_doc->isHTMLDocument() )
7439 return d->m_doc->htmlMode() == DOM::DocumentImpl::XHtml ?
".xhtml" :
".html";
7444 if (!d->m_bComplete || d->m_runningScripts || (d->m_doc && d->m_doc->parsing()))
7450 for (; it !=
end; ++it ) {
7451 if ((*it)->m_run || !(*it)->m_bCompleted)
7455 return d->m_submitForm || !d->m_redirectURL.isEmpty() || d->m_redirectionTimer.isActive() || d->m_job;
7458 using namespace KParts;
7459 #include "khtml_part.moc"
7460 #include "khtmlpart_p.moc"
7461 #ifndef KHTML_NO_WALLET
7462 #include "khtml_wallet_p.moc"