⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 html_headimpl.cpp

📁 konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版本源码包.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/** * This file is part of the DOM implementation for KDE. * * Copyright (C) 1999 Lars Knoll (knoll@kde.org) *           (C) 1999 Antti Koivisto (koivisto@kde.org) *           (C) 2001 Dirk Mueller (mueller@kde.org) *           (C) 2002-2003 Apple Computer, Inc. * * 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., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */// -------------------------------------------------------------------------#include "html/html_headimpl.h"#include "html/html_documentimpl.h"#include "xml/dom_textimpl.h"#include "khtmlview.h"#include "khtml_part.h"#include "misc/htmlhashes.h"#include "misc/loader.h"#include "misc/helper.h"#include "css/cssstyleselector.h"#include "css/css_stylesheetimpl.h"#include "css/csshelper.h"#include "ecma/kjs_proxy.h"#include <kurl.h>#include <kdebug.h>using namespace khtml;NodeImpl::Id HTMLBaseElementImpl::id() const{    return ID_BASE;}void HTMLBaseElementImpl::parseAttribute(AttributeImpl *attr){    switch(attr->id())    {    case ATTR_HREF:	m_href = khtml::parseURL(attr->value());	process();	break;    case ATTR_TARGET:	m_target = attr->value();	process();	break;    default:        HTMLElementImpl::parseAttribute(attr);    }}void HTMLBaseElementImpl::insertedIntoDocument(){    HTMLElementImpl::insertedIntoDocument();    process();}void HTMLBaseElementImpl::removedFromDocument(){    HTMLElementImpl::removedFromDocument();    // Since the document doesn't have a base element...    // (This will break in the case of multiple base elements, but that's not valid anyway (?))    getDocument()->setBaseURL( KURL() );    getDocument()->setBaseTarget( QString::null );}void HTMLBaseElementImpl::process(){    if (!inDocument())	return;    if(!m_href.isEmpty() && getDocument()->view())	getDocument()->setBaseURL( KURL( getDocument()->view()->part()->url(), m_href.string() ) );    if(!m_target.isEmpty())	getDocument()->setBaseTarget( m_target.string() );    // ### should changing a document's base URL dynamically automatically update all images, stylesheets etc?}// -------------------------------------------------------------------------HTMLLinkElementImpl::~HTMLLinkElementImpl(){    if(m_sheet) m_sheet->deref();    if(m_cachedSheet) m_cachedSheet->deref(this);}NodeImpl::Id HTMLLinkElementImpl::id() const{    return ID_LINK;}void HTMLLinkElementImpl::parseAttribute(AttributeImpl *attr){    switch (attr->id())    {    case ATTR_HREF:        m_url = getDocument()->completeURL( khtml::parseURL(attr->value()).string() );	process();        break;    case ATTR_REL:    case ATTR_TYPE:	process();        break;    case ATTR_TITLE:        // ### when title changes we have to reconsider our alternative        // stylesheet choice        break;    case ATTR_MEDIA:        m_media = attr->value().string().lower();        process();        break;    case ATTR_DISABLED: {        bool m_oldisDisabled = m_isDisabled;        m_isDisabled = attr->val();        if (m_oldisDisabled != m_isDisabled) {            if (isLoading()) {                if (m_oldisDisabled)                    getDocument()->addPendingSheet();                else if (!m_alternate)                    getDocument()->styleSheetLoaded();            }            if (m_oldisDisabled) {                // enabling: if it's an alternate sheet, pretend it's not.                m_alternate = false;            } else if (!m_alternate) {                // disabling: recheck alternate status                QString rel =  getAttribute(ATTR_REL).string().lower();                QString type = getAttribute(ATTR_TYPE).string().lower();                m_alternate = (type.contains("text/css") || rel.contains("stylesheet")) && rel.contains("alternate");            }            if (isLoading())                break;            if (!m_sheet && !m_isDisabled) {                process();                if (isLoading() && m_alternate)                    getDocument()->addPendingSheet();                m_alternate = false;            } else                getDocument()->updateStyleSelector(); // Update the style selector.        }        break;    }    default:        HTMLElementImpl::parseAttribute(attr);    }}void HTMLLinkElementImpl::process(){    if (!inDocument())        return;    QString type = getAttribute(ATTR_TYPE).string().lower();    QString rel = getAttribute(ATTR_REL).string().lower();    KHTMLPart* part = getDocument()->view() ? getDocument()->view()->part() : 0;    // IE extension: location of small icon for locationbar / bookmarks    // Uses both "shortcut icon" and "icon"    if ( part && rel.contains("icon") && !m_url.isEmpty() && !part->parentPart())        part->browserExtension()->setIconURL( KURL(m_url.string()) );    // Stylesheet    else if (!m_isDisabled &&        (type.contains("text/css") || rel.contains("stylesheet"))) {        // no need to load style sheets which aren't for the screen output        // ### there may be in some situations e.g. for an editor or script to manipulate        if( m_media.isNull() || m_media.contains("screen") || m_media.contains("all") || m_media.contains("print") ) {            m_loading = true;            // Add ourselves as a pending sheet, but only if we aren't an alternate            // stylesheet.  Alternate stylesheets don't hold up render tree construction.            m_alternate = rel.contains("alternate");            if (!isAlternate())                getDocument()->addPendingSheet();            QString chset = getAttribute( ATTR_CHARSET ).string();            if (m_cachedSheet)		m_cachedSheet->deref(this);            m_cachedSheet = getDocument()->docLoader()->requestStyleSheet(m_url, chset);            if (m_cachedSheet) {                m_isCSSSheet = true;		m_cachedSheet->ref(this);            }            else if (!isAlternate()) {                // Error requesting sheet; decrement pending sheet count                getDocument()->styleSheetLoaded();            }        }    }    else if (m_sheet) {	// we no longer contain a stylesheet, e.g. perhaps rel or type was changed	m_sheet->deref();	m_sheet = 0;        m_isCSSSheet = false;	getDocument()->updateStyleSelector();    }}void HTMLLinkElementImpl::insertedIntoDocument(){    HTMLElementImpl::insertedIntoDocument();    process();}void HTMLLinkElementImpl::removedFromDocument(){    HTMLElementImpl::removedFromDocument();    getDocument()->updateStyleSelector();}void HTMLLinkElementImpl::setStyleSheet(const DOM::DOMString &url, const DOM::DOMString &sheetStr){    if (m_sheet)        m_sheet->deref();    m_sheet = new CSSStyleSheetImpl(this, url);    m_sheet->ref();    m_sheet->parseString( sheetStr, !getDocument()->inCompatMode() );    MediaListImpl *media = new MediaListImpl( m_sheet, m_media );    m_sheet->setMedia( media );    finished();}void HTMLLinkElementImpl::finished(){    m_loading = false;    // Tell the doc about the sheet.    if (!isLoading() && !isDisabled() && !isAlternate())        getDocument()->styleSheetLoaded();    // ### major inefficiency, but currently necessary for proper    // alternate styles support. don't recalc the styleselector    // when nothing actually changed!    if ( isAlternate() && m_sheet && !isDisabled())        getDocument()->updateStyleSelector();}void HTMLLinkElementImpl::error( int, const QString& ){    finished();}bool HTMLLinkElementImpl::isLoading() const{//    kdDebug( 6030 ) << "link: checking if loading!" << endl;    if(m_loading) return true;    if(!m_sheet) return false;    //if(!m_sheet->isCSSStyleSheet()) return false;    return static_cast<CSSStyleSheetImpl *>(m_sheet)->isLoading();}void HTMLLinkElementImpl::sheetLoaded(){    if (!isLoading() && !isDisabled() && !isAlternate())        getDocument()->styleSheetLoaded();}// -------------------------------------------------------------------------NodeImpl::Id HTMLMetaElementImpl::id() const{    return ID_META;}void HTMLMetaElementImpl::parseAttribute(AttributeImpl *attr){    switch(attr->id())    {    case ATTR_HTTP_EQUIV:	m_equiv = attr->value();	process();	break;    case ATTR_CONTENT:	m_content = attr->value();	process();	break;    default:        HTMLElementImpl::parseAttribute(attr);    }}void HTMLMetaElementImpl::insertedIntoDocument(){    HTMLElementImpl::insertedIntoDocument();    process();}void HTMLMetaElementImpl::process(){    // Get the document to process the tag, but only if we're actually part of DOM tree (changing a meta tag while    // it's not in the tree shouldn't have any effect on the document)    if (inDocument() && !m_equiv.isNull() && !m_content.isNull())	getDocument()->processHttpEquiv(m_equiv,m_content);}// -------------------------------------------------------------------------HTMLScriptElementImpl::HTMLScriptElementImpl(DocumentPtr *doc)    : HTMLElementImpl(doc), m_cachedScript(0), m_createdByParser(false), m_evaluated(false)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -