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

📄 css_ruleimpl.cpp

📁 khtml在gtk上的移植版本
💻 CPP
字号:
/** * This file is part of the DOM implementation for KDE. * * (C) 1999-2003 Lars Knoll (knoll@kde.org) * (C) 2002-2003 Dirk Mueller (mueller@kde.org) * Copyright (C) 2002 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#include "dom/css_rule.h"#include "dom/css_stylesheet.h"#include "dom/dom_exception.h"#include "dom/dom_string.h"#include "css/css_stylesheetimpl.h"#include "css/css_valueimpl.h"#include "css/cssparser.h"#include "css/css_ruleimpl.h"#include "misc/loader.h"#include "misc/htmltags.h"#include "misc/htmlattrs.h"#include "xml/dom_docimpl.h"using namespace DOM;#include <kdebug.h>CSSStyleSheetImpl *CSSRuleImpl::parentStyleSheet() const{    return ( m_parent && m_parent->isCSSStyleSheet() )  ?	static_cast<CSSStyleSheetImpl *>(m_parent) : 0;}CSSRuleImpl *CSSRuleImpl::parentRule() const{    return ( m_parent && m_parent->isRule() )  ?	static_cast<CSSRuleImpl *>(m_parent) : 0;}DOM::DOMString CSSRuleImpl::cssText() const{    // ###    return DOMString();}void CSSRuleImpl::setCssText(DOM::DOMString /*str*/){    // ###}// ---------------------------------------------------------------------------CSSFontFaceRuleImpl::CSSFontFaceRuleImpl(StyleBaseImpl *parent)    : CSSRuleImpl(parent){    m_type = CSSRule::FONT_FACE_RULE;    m_style = 0;}CSSFontFaceRuleImpl::~CSSFontFaceRuleImpl(){    if(m_style) m_style->deref();}// --------------------------------------------------------------------------CSSImportRuleImpl::CSSImportRuleImpl( StyleBaseImpl *parent,                                      const DOM::DOMString &href,                                      MediaListImpl *media )    : CSSRuleImpl(parent){    m_type = CSSRule::IMPORT_RULE;    m_lstMedia = media;    if ( !m_lstMedia )	m_lstMedia = new MediaListImpl( this, DOMString() );    m_lstMedia->setParent( this );    m_lstMedia->ref();    m_strHref = href;    m_styleSheet = 0;    m_cachedSheet = 0;    init();}CSSImportRuleImpl::CSSImportRuleImpl( StyleBaseImpl *parent,                                      const DOM::DOMString &href,                                      const DOM::DOMString &media )    : CSSRuleImpl(parent){    m_type = CSSRule::IMPORT_RULE;    m_lstMedia = new MediaListImpl( this, media );    m_lstMedia->ref();    m_strHref = href;    m_styleSheet = 0;    m_cachedSheet = 0;    init();}CSSImportRuleImpl::~CSSImportRuleImpl(){    if( m_lstMedia ) { 	m_lstMedia->setParent( 0 );	m_lstMedia->deref();    }    if(m_styleSheet) {        m_styleSheet->setParent(0);        m_styleSheet->deref();    }    if(m_cachedSheet) m_cachedSheet->deref(this);}void CSSImportRuleImpl::setStyleSheet(const DOM::DOMString &url, const DOM::DOMString &sheet){    if ( m_styleSheet ) {        m_styleSheet->setParent(0);        m_styleSheet->deref();    }    m_styleSheet = new CSSStyleSheetImpl(this, url);    m_styleSheet->ref();    CSSStyleSheetImpl *parent = parentStyleSheet();    m_styleSheet->parseString( sheet, parent ? parent->useStrictParsing() : true );    m_loading = false;    checkLoaded();}bool CSSImportRuleImpl::isLoading(){    return ( m_loading || (m_styleSheet && m_styleSheet->isLoading()) );}void CSSImportRuleImpl::init(){    khtml::DocLoader *docLoader = 0;    StyleBaseImpl *root = this;    StyleBaseImpl *parent;    while ( ( parent = root->parent()) )	root = parent;    if (root->isCSSStyleSheet())	docLoader = static_cast<CSSStyleSheetImpl*>(root)->docLoader();    DOMString absHref = m_strHref;    CSSStyleSheetImpl *parentSheet = parentStyleSheet();    if (!parentSheet->href().isNull()) {      // use parent styleheet's URL as the base URL      absHref = KURL(parentSheet->href().string(),m_strHref.string()).url();    }/*    else {      // use documents's URL as the base URL      DocumentImpl *doc = static_cast<CSSStyleSheetImpl*>(root)->doc();      absHref = KURL(doc->URL(),m_strHref.string()).url();    }*/    // Check for a cycle in our import chain.  If we encounter a stylesheet    // in our parent chain with the same URL, then just bail.    for (parent = static_cast<StyleBaseImpl*>(this)->parent();         parent;         parent = parent->parent())        if (absHref == parent->baseURL())            return;        // ### pass correct charset here!!    m_cachedSheet = docLoader->requestStyleSheet(absHref, QString::null);    if (m_cachedSheet)    {      m_cachedSheet->ref(this);      // If the imported sheet is in the cache, then setStyleSheet gets called,      // and the sheet even gets parsed (via parseString).  In this case we have      // loaded (even if our subresources haven't), so if we have stylesheet after      // checking the cache, then we've clearly loaded. -dwh      if (!m_styleSheet)      m_loading = true;    }}// --------------------------------------------------------------------------CSSMediaRuleImpl::CSSMediaRuleImpl( StyleBaseImpl *parent, MediaListImpl *mediaList, CSSRuleListImpl *ruleList )    :   CSSRuleImpl( parent ){    m_type = CSSRule::MEDIA_RULE;    m_lstMedia = mediaList;    m_lstMedia->ref();    m_lstCSSRules = ruleList;    m_lstCSSRules->ref();}CSSMediaRuleImpl::CSSMediaRuleImpl(StyleBaseImpl *parent)    :   CSSRuleImpl( parent ){    m_type = CSSRule::MEDIA_RULE;    m_lstMedia = 0;    m_lstCSSRules = new CSSRuleListImpl();    m_lstCSSRules->ref();}CSSMediaRuleImpl::CSSMediaRuleImpl( StyleBaseImpl *parent, const DOM::DOMString &media ):   CSSRuleImpl( parent ){    m_type = CSSRule::MEDIA_RULE;    m_lstMedia = new MediaListImpl( this, media );    m_lstMedia->ref();    m_lstCSSRules = new CSSRuleListImpl();    m_lstCSSRules->ref();}CSSMediaRuleImpl::~CSSMediaRuleImpl(){    if( m_lstMedia ) {	m_lstMedia->setParent( 0 );        m_lstMedia->deref();    }    int length = m_lstCSSRules->length();    for (int i = 0; i < length; i++) {	m_lstCSSRules->item( i )->setParent( 0 );    }    m_lstCSSRules->deref();}unsigned long CSSMediaRuleImpl::append( CSSRuleImpl *rule ){    if (!rule) {	return 0;    }    rule->setParent(this);    return m_lstCSSRules->insertRule( rule, m_lstCSSRules->length() );}unsigned long CSSMediaRuleImpl::insertRule( const DOMString &rule,                                            unsigned long index ){    CSSParser p( strictParsing );    CSSRuleImpl *newRule = p.parseRule( parentStyleSheet(), rule );    if (!newRule) {	return 0;    }    newRule->setParent(this);    return m_lstCSSRules->insertRule( newRule, index );}CSSRuleListImpl::~CSSRuleListImpl(){    CSSRuleImpl* rule;    while ( !m_lstCSSRules.isEmpty() && ( rule = m_lstCSSRules.take( 0 ) ) )        rule->deref();}// ---------------------------------------------------------------------------CSSPageRuleImpl::CSSPageRuleImpl(StyleBaseImpl *parent)    : CSSRuleImpl(parent){    m_type = CSSRule::PAGE_RULE;    m_style = 0;}CSSPageRuleImpl::~CSSPageRuleImpl(){    if(m_style) m_style->deref();}DOM::DOMString CSSPageRuleImpl::selectorText() const{    // ###    return DOMString();}void CSSPageRuleImpl::setSelectorText(DOM::DOMString /*str*/){    // ###}// --------------------------------------------------------------------------CSSStyleRuleImpl::CSSStyleRuleImpl(StyleBaseImpl *parent)    : CSSRuleImpl(parent){    m_type = CSSRule::STYLE_RULE;    m_style = 0;    m_selector = 0;}CSSStyleRuleImpl::~CSSStyleRuleImpl(){    if(m_style) {	m_style->setParent( 0 );	m_style->deref();    }    delete m_selector;}DOM::DOMString CSSStyleRuleImpl::selectorText() const{    // FIXME: Handle all the selectors in the chain for comma-separated selectors.    if (m_selector)        return m_selector->selectorText();    return DOMString();}void CSSStyleRuleImpl::setSelectorText(DOM::DOMString /*str*/){    // ###}bool CSSStyleRuleImpl::parseString( const DOMString &/*string*/, bool ){    // ###    return false;}void CSSStyleRuleImpl::setDeclaration( CSSStyleDeclarationImpl *style){    if ( m_style != style ) {        if(m_style) m_style->deref();        m_style = style;        if(m_style) m_style->ref();    }}void CSSRuleListImpl::deleteRule ( unsigned long index ){    CSSRuleImpl *rule = m_lstCSSRules.take( index );    if( rule )        rule->deref();    else        ; // ### Throw INDEX_SIZE_ERR exception here (TODO)}void CSSRuleListImpl::append( CSSRuleImpl *rule ){    insertRule( rule, m_lstCSSRules.count() ) ;}unsigned long CSSRuleListImpl::insertRule( CSSRuleImpl *rule,                                           unsigned long index ){    if( rule && m_lstCSSRules.insert( index, rule ) )    {        rule->ref();        return index;    }    // ### Should throw INDEX_SIZE_ERR exception instead! (TODO)    return 0;}

⌨️ 快捷键说明

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