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

📄 html_baseimpl.cpp

📁 khtml在gtk上的移植版本
💻 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) 2000 Simon Hausmann (hausmann@kde.org) *           (C) 2001 Dirk Mueller (mueller@kde.org) * Copyright (C) 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */// -------------------------------------------------------------------------#include "html/html_baseimpl.h"#include "html/html_documentimpl.h"#include "khtmlview.h"#include "khtml_part.h"#include "rendering/render_frames.h"#include "css/cssstyleselector.h"#include "css/css_stylesheetimpl.h"#include "css/cssproperties.h"#include "css/cssvalues.h"#include "css/csshelper.h"#include "misc/loader.h"#include "misc/htmlhashes.h"#include "dom/dom_string.h"#include "dom/dom_doc.h"#include "xml/dom2_eventsimpl.h"#include <kurl.h>#include <kdebug.h>using namespace DOM;using namespace khtml;HTMLBodyElementImpl::HTMLBodyElementImpl(DocumentPtr *doc)    : HTMLElementImpl(doc), m_linkDecl(0){}HTMLBodyElementImpl::~HTMLBodyElementImpl(){    if (m_linkDecl) {        m_linkDecl->setParent(0);        m_linkDecl->deref();    }}NodeImpl::Id HTMLBodyElementImpl::id() const{    return ID_BODY;}void HTMLBodyElementImpl::createLinkDecl(){    m_linkDecl = new CSSStyleDeclarationImpl(0);    m_linkDecl->ref();    m_linkDecl->setParent(getDocument()->elementSheet());    m_linkDecl->setNode(this);    m_linkDecl->setStrictParsing(!getDocument()->inCompatMode());}bool HTMLBodyElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const{    switch(attr)    {        case ATTR_BACKGROUND:        case ATTR_BGCOLOR:        case ATTR_TEXT:        case ATTR_MARGINWIDTH:        case ATTR_LEFTMARGIN:        case ATTR_MARGINHEIGHT:        case ATTR_TOPMARGIN:        case ATTR_BGPROPERTIES:            result = eUniversal;            return false;        default:            break;    }        return HTMLElementImpl::mapToEntry(attr, result);}void HTMLBodyElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr){    switch(attr->id())    {    case ATTR_BACKGROUND:    {        QString url = khtml::parseURL( attr->value() ).string();        if (!url.isEmpty())            addCSSImageProperty(attr, CSS_PROP_BACKGROUND_IMAGE, getDocument()->completeURL(url));        break;    }    case ATTR_MARGINWIDTH:        addCSSLength(attr, CSS_PROP_MARGIN_RIGHT, attr->value() );        /* nobreak; */    case ATTR_LEFTMARGIN:        addCSSLength(attr, CSS_PROP_MARGIN_LEFT, attr->value() );        break;    case ATTR_MARGINHEIGHT:        addCSSLength(attr, CSS_PROP_MARGIN_BOTTOM, attr->value());        /* nobreak */    case ATTR_TOPMARGIN:        addCSSLength(attr, CSS_PROP_MARGIN_TOP, attr->value());        break;    case ATTR_BGCOLOR:        addHTMLColor(attr, CSS_PROP_BACKGROUND_COLOR, attr->value());        break;    case ATTR_TEXT:        addHTMLColor(attr, CSS_PROP_COLOR, attr->value());        break;    case ATTR_BGPROPERTIES:        if ( strcasecmp( attr->value(), "fixed" ) == 0)            addCSSProperty(attr, CSS_PROP_BACKGROUND_ATTACHMENT, CSS_VAL_FIXED);        break;    case ATTR_VLINK:    case ATTR_ALINK:    case ATTR_LINK:    {        if (attr->isNull()) {            if (attr->id() == ATTR_LINK)                getDocument()->resetLinkColor();            else if (attr->id() == ATTR_VLINK)                getDocument()->resetVisitedLinkColor();            else                getDocument()->resetActiveLinkColor();        }        else {            if (!m_linkDecl)                createLinkDecl();            m_linkDecl->setProperty(CSS_PROP_COLOR, attr->value(), false, false);            CSSValueImpl* val = m_linkDecl->getPropertyCSSValue(CSS_PROP_COLOR);            if (val && val->isPrimitiveValue()) {                QColor col = getDocument()->styleSelector()->getColorFromPrimitiveValue(static_cast<CSSPrimitiveValueImpl*>(val));                if (attr->id() == ATTR_LINK)                    getDocument()->setLinkColor(col);                else if (attr->id() == ATTR_VLINK)                    getDocument()->setVisitedLinkColor(col);                else                    getDocument()->setActiveLinkColor(col);            }        }                if (attached())            getDocument()->recalcStyle(Force);        break;    }    case ATTR_ONLOAD:        getDocument()->setHTMLWindowEventListener(EventImpl::LOAD_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONUNLOAD:        getDocument()->setHTMLWindowEventListener(EventImpl::UNLOAD_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONBLUR:        getDocument()->setHTMLWindowEventListener(EventImpl::BLUR_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONFOCUS:        getDocument()->setHTMLWindowEventListener(EventImpl::FOCUS_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONRESIZE:        getDocument()->setHTMLWindowEventListener(EventImpl::RESIZE_EVENT,	    getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONSCROLL:        getDocument()->setHTMLWindowEventListener(EventImpl::SCROLL_EVENT,                                                  getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_NOSAVE:	break;    default:        HTMLElementImpl::parseHTMLAttribute(attr);    }}void HTMLBodyElementImpl::insertedIntoDocument(){    HTMLElementImpl::insertedIntoDocument();    // FIXME: perhaps all this stuff should be in attach() instead of here...    KHTMLView* w = getDocument()->view();    if (w && w->marginWidth() != -1) {        QString s;        s.sprintf( "%d", w->marginWidth() );        setAttribute(ATTR_MARGINWIDTH, s);    }    if (w && w->marginHeight() != -1) {        QString s;        s.sprintf( "%d", w->marginHeight() );        setAttribute(ATTR_MARGINHEIGHT, s);    }}bool HTMLBodyElementImpl::isURLAttribute(AttributeImpl *attr) const{    return attr->id() == ATTR_BACKGROUND;}// -------------------------------------------------------------------------HTMLFrameElementImpl::HTMLFrameElementImpl(DocumentPtr *doc)    : HTMLElementImpl(doc){    frameBorder = true;    frameBorderSet = false;    marginWidth = -1;    marginHeight = -1;    scrolling = QScrollView::Auto;    noresize = false;}HTMLFrameElementImpl::~HTMLFrameElementImpl(){}NodeImpl::Id HTMLFrameElementImpl::id() const{    return ID_FRAME;}bool HTMLFrameElementImpl::isURLAllowed(const AtomicString &URLString) const{    if (URLString.isEmpty()) {        return true;    }        KHTMLView *w = getDocument()->view();    if (!w) {	return false;    }    KURL newURL(getDocument()->completeURL(URLString.string()));    newURL.setRef(QString::null);    // Don't allow more than 1000 total frames in a set. This seems    // like a reasonable upper bound, and otherwise mutually recursive    // frameset pages can quickly bring the program to its knees with    // exponential growth in the number of frames.    // FIXME: This limit could be higher, but WebKit has some    // algorithms that happen while loading which appear to be N^2 or    // worse in the number of frames    if (w->part()->topLevelFrameCount() >= 200) {	return false;    }    // Prohibit non-file URLs if we are asked to.    if (w->part()->onlyLocalReferences() && newURL.protocol().lower() != "file") {        return false;    }    // We allow one level of self-reference because some sites depend on that.    // But we don't allow more than one.    bool foundSelfReference = false;    for (KHTMLPart *part = w->part(); part; part = part->parentPart()) {        KURL partURL = part->url();        partURL.setRef(QString::null);        if (partURL == newURL) {            if (foundSelfReference) {                return false;            }            foundSelfReference = true;        }    }        return true;}void HTMLFrameElementImpl::updateForNewURL(){    if (!attached()) {        return;    }        // Handle the common case where we decided not to make a frame the first time.    // Detach and the let attach() decide again whether to make the frame for this URL.    if (!m_render) {        detach();        attach();        return;    }        if (!isURLAllowed(url)) {        return;    }    openURL();}void HTMLFrameElementImpl::openURL(){    KHTMLView *w = getDocument()->view();    if (!w) {        return;    }        AtomicString relativeURL = url;    if (relativeURL.isEmpty()) {        relativeURL = "about:blank";    }    // Load the frame contents.    KHTMLPart *part = w->part();    KHTMLPart *framePart = part->findFrame(name.string());    if (framePart) {        framePart->openURL(getDocument()->completeURL(relativeURL.string()));    } else {        part->requestFrame(static_cast<RenderFrame *>(m_render), relativeURL.string(), name.string());    }}void HTMLFrameElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr){    switch(attr->id())    {    case ATTR_SRC:        setLocation(khtml::parseURL(attr->value()));        break;    case ATTR_ID:        // Important to call through to base for ATTR_ID so the hasID bit gets set.        HTMLElementImpl::parseHTMLAttribute(attr);        // fall through    case ATTR_NAME:        name = attr->value();        // FIXME: If we are already attached, this doesn't actually change the frame's name.        // FIXME: If we are already attached, this doesn't check for frame name        // conflicts and generate a unique frame name.        break;    case ATTR_FRAMEBORDER:        frameBorder = attr->value().toInt();        frameBorderSet = !attr->isNull();        // FIXME: If we are already attached, this has no effect.        break;    case ATTR_MARGINWIDTH:        marginWidth = attr->value().toInt();        // FIXME: If we are already attached, this has no effect.        break;    case ATTR_MARGINHEIGHT:        marginHeight = attr->value().toInt();        // FIXME: If we are already attached, this has no effect.        break;    case ATTR_NORESIZE:        noresize = true;        // FIXME: If we are already attached, this has no effect.        break;    case ATTR_SCROLLING:        kdDebug( 6031 ) << "set scroll mode" << endl;	// Auto and yes both simply mean "allow scrolling."  No means	// "don't allow scrolling."        if( strcasecmp( attr->value(), "auto" ) == 0 ||            strcasecmp( attr->value(), "yes" ) == 0 )            scrolling = QScrollView::Auto;        else if( strcasecmp( attr->value(), "no" ) == 0 )            scrolling = QScrollView::AlwaysOff;        // FIXME: If we are already attached, this has no effect.        break;    case ATTR_ONLOAD:        setHTMLEventListener(EventImpl::LOAD_EVENT,                                getDocument()->createHTMLEventListener(attr->value().string()));        break;    case ATTR_ONUNLOAD:        setHTMLEventListener(EventImpl::UNLOAD_EVENT,                                getDocument()->createHTMLEventListener(attr->value().string()));        break;    default:        HTMLElementImpl::parseHTMLAttribute(attr);

⌨️ 快捷键说明

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