📄 khtml_part.cpp
字号:
// -*- c-basic-offset: 2 -*-/* This file is part of the KDE project * * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> * 1999 Lars Knoll <knoll@kde.org> * 1999 Antti Koivisto <koivisto@kde.org> * 2000 Simon Hausmann <hausmann@kde.org> * 2000 Stefan Schimanski <1Stein@gmx.de> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *///#define SPEED_DEBUG#include "khtml_part.h"#include "khtml_factory.h"#include "khtml_run.h"#include "khtml_events.h"#include "khtml_find.h"#include "khtml_ext.h"#include "khtml_pagecache.h"#include "dom/dom_string.h"#include "dom/dom_element.h"#include "html/html_documentimpl.h"#include "html/html_baseimpl.h"#include "html/html_miscimpl.h"#include "html/html_imageimpl.h"#include "html/htmltokenizer.h"#include "rendering/render_text.h"#include "rendering/render_image.h"#include "rendering/render_frames.h"#include "misc/htmlhashes.h"#include "misc/loader.h"#include "xml/dom_textimpl.h"#include "xml/dom2_eventsimpl.h"#include "css/cssstyleselector.h"#include "java/kjavaappletcontext.h"#if defined(KONQ_EMBEDDED) && defined(ENABLE_JS_HOSTEXTEND)#include <jsextconnect.h>#include <ecma/kjs_dom.h>#endifusing namespace DOM;#include "khtmlview.h"#include "decoder.h"#include "ecma/kjs_proxy.h"#include "khtml_settings.h"#include <sys/types.h>#include <assert.h>#include <unistd.h>#include <kglobal.h>#include <kstddirs.h>#include <kio/job.h>#include <kparts/historyprovider.h>#include <kmimetype.h>#include <kdebug.h>#include <klocale.h>#include <kcharsets.h>#include <kmessagebox.h>#include <kaction.h>#include <kstdaction.h>#include <kfiledialog.h>#include <ktrader.h>#include <kparts/partmanager.h>#include <kxmlgui.h>#include <kcursor.h>#include <kdatastream.h>#include <ktempfile.h>#include <kglobalsettings.h>#include <kurldrag.h>#include <kssl.h>#include <ksslinfodlg.h>#include <qtextcodec.h>#include <qstring.h>#include <qfile.h>#include <qclipboard.h>#include <qapplication.h>#include <qdragobject.h>#include <qmetaobject.h>namespace khtml{ struct ChildFrame { enum Type { Frame, IFrame, Object }; ChildFrame() { m_bCompleted = false; m_bPreloaded = false; m_type = Frame; m_bNotify = false; } ~ChildFrame() { delete (KHTMLRun*) m_run; } QGuardedPtr<khtml::RenderPart> m_frame; QGuardedPtr<KParts::ReadOnlyPart> m_part; QGuardedPtr<KParts::BrowserExtension> m_extension; QString m_serviceName; QString m_serviceType; QStringList m_services; bool m_bCompleted; QString m_name; KParts::URLArgs m_args; QGuardedPtr<KHTMLRun> m_run; bool m_bPreloaded; KURL m_workingURL; Type m_type; QStringList m_params; bool m_bNotify; };};class FrameList : public QValueList<khtml::ChildFrame>{public: Iterator find( const QString &name );};int kjs_lib_count = 0;typedef FrameList::ConstIterator ConstFrameIt;typedef FrameList::Iterator FrameIt;class KHTMLPartPrivate{public: KHTMLPartPrivate(QObject* parent) { m_doc = 0L; m_decoder = 0L; m_jscript = 0L; m_runningScripts = 0; m_kjs_lib = 0; m_job = 0L; m_bComplete = true; m_bLoadEventEmitted = true; m_bParsing = false; m_bReloading = false; m_manager = 0L; m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings()); m_bClearing = false; m_bCleared = false; m_fontBase = 0; m_bDnd = true; m_startOffset = m_endOffset = 0; m_startBeforeEnd = true; m_linkCursor = KCursor::handCursor(); m_loadedImages = 0; m_totalImageCount = 0; m_haveEncoding = false; m_activeFrame = 0L; m_findDialog = 0; m_ssl_in_use = false; m_javaContext = 0; m_cacheId = 0; m_frameNameId = 1; m_bJScriptForce = false; m_bJScriptOverride = false; m_bJavaForce = false; m_bJavaOverride = false; m_bPluginsForce = false; m_bPluginsOverride = false; m_onlyLocalReferences = false; m_metaRefreshEnabled = true; m_bHTTPRefresh = false; m_bFirstData = true; m_submitForm = 0; m_delayRedirect = 0; m_bPendingChildRedirection = false; // inherit security settings from parent if(parent && parent->inherits("KHTMLPart")) { KHTMLPart* part = static_cast<KHTMLPart*>(parent); if(part->d) { m_bJScriptForce = part->d->m_bJScriptForce; m_bJScriptOverride = part->d->m_bJScriptOverride; m_bJavaForce = part->d->m_bJavaForce; m_bJavaOverride = part->d->m_bJavaOverride; m_bPluginsForce = part->d->m_bPluginsForce; m_bPluginsOverride = part->d->m_bPluginsOverride; // Same for SSL settings m_ssl_in_use = part->d->m_ssl_in_use; m_onlyLocalReferences = part->d->m_onlyLocalReferences; } } m_focusNodeNumber = 0; m_focusNodeRestored = false; m_opener = 0; m_openedByJS = false; } ~KHTMLPartPrivate() { delete m_extension; delete m_settings; delete m_jscript; if ( m_kjs_lib && !--kjs_lib_count ) delete m_kjs_lib; delete m_javaContext; } FrameList m_frames; QValueList<khtml::ChildFrame> m_objects; QGuardedPtr<KHTMLView> m_view; KHTMLPartBrowserExtension *m_extension; KHTMLPartBrowserHostExtension *m_hostExtension; DOM::DocumentImpl *m_doc; khtml::Decoder *m_decoder; QString m_encoding; QFont::CharSet m_charset; long m_cacheId; QString scheduledScript; DOM::Node scheduledScriptNode; KJSProxy *m_jscript; KLibrary *m_kjs_lib; int m_runningScripts; bool m_bJScriptEnabled :1; bool m_bJavaEnabled :1; bool m_bPluginsEnabled :1; bool m_bJScriptForce :1; bool m_bJScriptOverride :1; bool m_bJavaForce :1; bool m_bJavaOverride :1; bool m_bPluginsForce :1; bool m_metaRefreshEnabled :1; bool m_bPluginsOverride :1; int m_frameNameId; KJavaAppletContext *m_javaContext; KHTMLSettings *m_settings; KIO::TransferJob * m_job; QString m_kjsStatusBarText; QString m_kjsDefaultStatusBarText; // QStrings for SSL metadata // Note: When adding new variables don't forget to update ::saveState()/::restoreState()! bool m_ssl_in_use; QString m_ssl_peer_cert_subject, m_ssl_peer_cert_issuer, m_ssl_peer_ip, m_ssl_cipher, m_ssl_cipher_desc, m_ssl_cipher_version, m_ssl_cipher_used_bits, m_ssl_cipher_bits, m_ssl_cert_state, m_ssl_good_from, m_ssl_good_until; bool m_bComplete:1; bool m_bLoadEventEmitted:1; bool m_bParsing:1; bool m_bReloading:1; bool m_haveEncoding:1; bool m_haveCharset:1; bool m_bHTTPRefresh:1; bool m_onlyLocalReferences :1; KURL m_workingURL; KURL m_baseURL; QString m_baseTarget; QTimer m_redirectionTimer;#ifdef SPEED_DEBUG QTime m_parsetime;#endif int m_delayRedirect; QString m_redirectURL; KAction *m_paViewDocument; KAction *m_paViewFrame; KAction *m_paSaveBackground; KAction *m_paSaveDocument; KAction *m_paSaveFrame; KAction *m_paSecurity; KSelectAction *m_paSetEncoding; KHTMLFontSizeAction *m_paIncFontSizes; KHTMLFontSizeAction *m_paDecFontSizes; KAction *m_paLoadImages; KAction *m_paFind; KAction *m_paPrintFrame; KAction *m_paSelectAll; KAction *m_paDebugDOMTree; KAction *m_paDebugRenderTree; KParts::PartManager *m_manager; QString m_popupMenuXML; int m_fontBase; int m_findPos; DOM::NodeImpl *m_findNode; QString m_strSelectedURL; QString m_referrer; struct SubmitForm { const char *submitAction; QString submitUrl; QByteArray submitFormData; QString target; QString submitContentType; QString submitBoundary; }; SubmitForm *m_submitForm; bool m_bMousePressed; DOM::Node m_mousePressNode; //node under the mouse when the mouse was pressed (set in the mouse handler) DOM::Node m_selectionStart; long m_startOffset; DOM::Node m_selectionEnd; long m_endOffset; QString m_overURL; bool m_startBeforeEnd:1; bool m_bDnd:1; bool m_bFirstData:1; bool m_bClearing:1; bool m_bCleared:1; bool m_focusNodeRestored:1; int m_focusNodeNumber; QPoint m_dragStartPos;#ifdef KHTML_NO_SELECTION QPoint m_dragLastPos;#endif QCursor m_linkCursor; QTimer m_scrollTimer; unsigned long m_loadedImages; unsigned long m_totalImageCount; KHTMLFind *m_findDialog; struct findState { findState() { caseSensitive = false; direction = false; } QString text; bool caseSensitive; bool direction; }; findState m_lastFindState; //QGuardedPtr<KParts::Part> m_activeFrame; KParts::Part * m_activeFrame; QGuardedPtr<KHTMLPart> m_opener; bool m_openedByJS; bool m_bPendingChildRedirection;};namespace khtml { class PartStyleSheetLoader : public CachedObjectClient { public: PartStyleSheetLoader(KHTMLPart *part, DOM::DOMString url, DocLoader* dl) { m_part = part; m_cachedSheet = dl->requestStyleSheet( url, part->baseURL().url(), QString::null ); if (m_cachedSheet) m_cachedSheet->ref( this ); } virtual ~PartStyleSheetLoader() { if ( m_cachedSheet ) m_cachedSheet->deref(this); } virtual void setStyleSheet(const DOM::DOMString&, const DOM::DOMString &sheet) { if ( m_part ) m_part->setUserStyleSheet( sheet.string() ); delete this; } QGuardedPtr<KHTMLPart> m_part; khtml::CachedCSSStyleSheet *m_cachedSheet; };};FrameList::Iterator FrameList::find( const QString &name ){ Iterator it = begin(); Iterator e = end(); for (; it!=e; ++it ) if ( (*it).m_name==name ) break; return it;}static QString splitUrlTarget(const QString &url, QString *target=0){ QString result = url; if(url.left(7) == "target:") { KURL u(url); result = u.ref(); if (target) *target = u.host(); } return result;}KHTMLPart::KHTMLPart( QWidget *parentWidget, const char *widgetname, QObject *parent, const char *name, GUIProfile prof ): KParts::ReadOnlyPart( parent, name ){ d = 0; KHTMLFactory::registerPart( this ); setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI ); // doesn't work inside init() for derived classes // Why?? :-} (Simon) init( new KHTMLView( this, parentWidget, widgetname ), prof );}KHTMLPart::KHTMLPart( KHTMLView *view, QObject *parent, const char *name, GUIProfile prof ): KParts::ReadOnlyPart( parent, name ){ d = 0; KHTMLFactory::registerPart( this ); setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI ); assert( view );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -