📄 html_baseimpl.cpp
字号:
/** * 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-2003 Dirk Mueller (mueller@kde.org) * * 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_baseimpl.h"#include "html/html_documentimpl.h"#include "khtmlview.h"#include "khtml_part.h"#include "rendering/render_frames.h"#include "rendering/render_body.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_bgSet( false ), m_fgSet( false ){ m_styleSheet = 0;}HTMLBodyElementImpl::~HTMLBodyElementImpl(){ if(m_styleSheet) m_styleSheet->deref();}NodeImpl::Id HTMLBodyElementImpl::id() const{ return ID_BODY;}void HTMLBodyElementImpl::parseAttribute(AttributeImpl *attr){ switch(attr->id()) { case ATTR_BACKGROUND: { QString url = khtml::parseURL( attr->value() ).string(); if (!url.isEmpty()) { url = getDocument()->completeURL( url ); addCSSProperty(CSS_PROP_BACKGROUND_IMAGE, "url('"+url+"')" ); m_bgSet = true; } else { removeCSSProperty(CSS_PROP_BACKGROUND_IMAGE); m_bgSet = false; } break; } case ATTR_MARGINWIDTH: { KHTMLView* w = getDocument()->view(); if (w) w->setMarginWidth( -1 ); // unset this, so it doesn't override the setting here addCSSLength(CSS_PROP_MARGIN_RIGHT, attr->value() ); } /* nobreak; */ case ATTR_LEFTMARGIN: addCSSLength(CSS_PROP_MARGIN_LEFT, attr->value() ); break; case ATTR_MARGINHEIGHT: { KHTMLView* w = getDocument()->view(); if (w) w->setMarginHeight( -1 ); // unset this, so it doesn't override the setting here addCSSLength(CSS_PROP_MARGIN_BOTTOM, attr->value()); } /* nobreak */ case ATTR_TOPMARGIN: addCSSLength(CSS_PROP_MARGIN_TOP, attr->value()); break; case ATTR_BGCOLOR: addHTMLColor(CSS_PROP_BACKGROUND_COLOR, attr->value()); m_bgSet = !attr->value().isNull(); break; case ATTR_TEXT: addHTMLColor(CSS_PROP_COLOR, attr->value()); m_fgSet = !attr->value().isNull(); break; case ATTR_BGPROPERTIES: if ( strcasecmp( attr->value(), "fixed" ) == 0) addCSSProperty(CSS_PROP_BACKGROUND_ATTACHMENT, CSS_VAL_FIXED); break; case ATTR_VLINK: case ATTR_ALINK: case ATTR_LINK: { if(!m_styleSheet) { m_styleSheet = new CSSStyleSheetImpl(this,DOMString(),true); m_styleSheet->ref(); } QString aStr; if ( attr->id() == ATTR_LINK ) aStr = "a:link"; else if ( attr->id() == ATTR_VLINK ) aStr = "a:visited"; else if ( attr->id() == ATTR_ALINK ) aStr = "a:active"; aStr += " { color: " + attr->value().string() + "; }"; m_styleSheet->parseString(aStr, !getDocument()->inCompatMode()); m_styleSheet->setNonCSSHints(); if (attached()) getDocument()->updateStyleSelector(); break; } case ATTR_ONLOAD: getDocument()->setHTMLWindowEventListener(EventImpl::LOAD_EVENT, getDocument()->createHTMLEventListener(attr->value().string(), "onload", NULL)); break; case ATTR_ONUNLOAD: getDocument()->setHTMLWindowEventListener(EventImpl::UNLOAD_EVENT, getDocument()->createHTMLEventListener(attr->value().string(), "onunload", NULL)); break; case ATTR_ONBLUR: getDocument()->setHTMLWindowEventListener(EventImpl::BLUR_EVENT, getDocument()->createHTMLEventListener(attr->value().string(), "onblur", NULL)); break; case ATTR_ONFOCUS: getDocument()->setHTMLWindowEventListener(EventImpl::FOCUS_EVENT, getDocument()->createHTMLEventListener(attr->value().string(), "onfocus", NULL)); break; case ATTR_ONRESIZE: getDocument()->setHTMLWindowEventListener(EventImpl::RESIZE_EVENT, getDocument()->createHTMLEventListener(attr->value().string(), "onresize", NULL)); break; case ATTR_NOSAVE: break; default: HTMLElementImpl::parseAttribute(attr); }}void HTMLBodyElementImpl::insertedIntoDocument(){ HTMLElementImpl::insertedIntoDocument(); KHTMLView* w = getDocument()->view(); if(w && w->marginWidth() != -1) { QString s; s.sprintf( "%d", w->marginWidth() ); addCSSLength(CSS_PROP_MARGIN_LEFT, s); addCSSLength(CSS_PROP_MARGIN_RIGHT, s); } if(w && w->marginHeight() != -1) { QString s; s.sprintf( "%d", w->marginHeight() ); addCSSLength(CSS_PROP_MARGIN_TOP, s); addCSSLength(CSS_PROP_MARGIN_BOTTOM, s); } if ( m_bgSet && !m_fgSet ) addCSSProperty(CSS_PROP_COLOR, CSS_VAL_BLACK); if (m_styleSheet) getDocument()->updateStyleSelector();}void HTMLBodyElementImpl::removedFromDocument(){ HTMLElementImpl::removedFromDocument(); if (m_styleSheet) getDocument()->updateStyleSelector();}void HTMLBodyElementImpl::attach(){ assert(!m_render); assert(parentNode()); RenderStyle* style = getDocument()->styleSelector()->styleForElement(this); style->ref(); if (parentNode()->renderer() && style->display() != NONE) { if (style->display() == BLOCK) // only use the quirky class for block display m_render = new (getDocument()->renderArena()) RenderBody(this); else m_render = RenderObject::createObject(this, style); m_render->setStyle(style); parentNode()->renderer()->addChild(m_render, nextRenderer()); } style->deref(); NodeBaseImpl::attach();}// -------------------------------------------------------------------------HTMLFrameElementImpl::HTMLFrameElementImpl(DocumentPtr *doc) : HTMLElementImpl(doc){ frameBorder = true; frameBorderSet = false; marginWidth = -1; marginHeight = -1; scrolling = QScrollView::Auto; noresize = false; url = "about:blank";}HTMLFrameElementImpl::~HTMLFrameElementImpl(){}NodeImpl::Id HTMLFrameElementImpl::id() const{ return ID_FRAME;}void HTMLFrameElementImpl::parseAttribute(AttributeImpl *attr){ switch(attr->id()) { case ATTR_SRC: setLocation(khtml::parseURL(attr->val())); break; case ATTR_FRAMEBORDER: { frameBorder = attr->value().toInt(); frameBorderSet = ( attr->val() != 0 ); // FIXME: when attached, has no effect } break; case ATTR_MARGINWIDTH: marginWidth = attr->val()->toInt(); // FIXME: when attached, has no effect break; case ATTR_MARGINHEIGHT: marginHeight = attr->val()->toInt(); // FIXME: when attached, has no effect break; case ATTR_NORESIZE: noresize = true; // FIXME: when attached, has no effect break; case ATTR_SCROLLING: if( strcasecmp( attr->value(), "auto" ) == 0 ) scrolling = QScrollView::Auto; else if( strcasecmp( attr->value(), "yes" ) == 0 ) scrolling = QScrollView::AlwaysOn; else if( strcasecmp( attr->value(), "no" ) == 0 ) scrolling = QScrollView::AlwaysOff; // when attached, has no effect break; case ATTR_ONLOAD: setHTMLEventListener(EventImpl::LOAD_EVENT, getDocument()->createHTMLEventListener(attr->value().string(), "onload", this)); break; case ATTR_ONUNLOAD: setHTMLEventListener(EventImpl::UNLOAD_EVENT, getDocument()->createHTMLEventListener(attr->value().string(), "onunload", this)); break; case ATTR_ID: case ATTR_NAME: // FIXME: if already attached, doesn't change the frame name // FIXME: frame name conflicts, no unique frame name anymore name = attr->value(); //fallthrough intentional, let the base handle it default: HTMLElementImpl::parseAttribute(attr); }}void HTMLFrameElementImpl::attach(){ assert(!attached()); assert(parentNode()); name = getAttribute(ATTR_NAME); if (name.isNull()) name = getAttribute(ATTR_ID); // inherit default settings from parent frameset HTMLElementImpl* node = static_cast<HTMLElementImpl*>(parentNode()); while(node) { if(node->id() == ID_FRAMESET) { HTMLFrameSetElementImpl* frameset = static_cast<HTMLFrameSetElementImpl*>(node); if(!frameBorderSet) frameBorder = frameset->frameBorder(); if(!noresize) noresize = frameset->noResize(); break; } node = static_cast<HTMLElementImpl*>(node->parentNode()); } if (parentNode()->renderer() && getDocument()->isURLAllowed(url.string())) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -