📄 html_objectimpl.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 Stefan Schimanski (1Stein@gmx.de) * Copyright (C) 2004 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_objectimpl.h"#include "khtml_part.h"#include "dom/dom_string.h"#include "misc/htmlhashes.h"#include "khtmlview.h"#include <qstring.h>#include <qmap.h>#include <kdebug.h>#include "xml/dom_docimpl.h"#include "css/cssstyleselector.h"#include "css/csshelper.h"#include "css/cssproperties.h"#include "css/cssvalues.h"#include "rendering/render_applet.h"#include "rendering/render_frames.h"#include "rendering/render_image.h"#include "xml/dom2_eventsimpl.h"#ifndef Q_WS_QWS // We don't have Java in Qt Embedded#include "java/kjavaappletwidget.h"#include "java/kjavaappletcontext.h"#endif#if APPLE_CHANGES#include "KWQKHTMLPart.h"#endifusing namespace DOM;using namespace khtml;// -------------------------------------------------------------------------HTMLAppletElementImpl::HTMLAppletElementImpl(DocumentPtr *doc) : HTMLElementImpl(doc){#if !KWIQ_NO_JAVA appletInstance = 0;#endif}HTMLAppletElementImpl::~HTMLAppletElementImpl(){#if !KWIQ_NO_JAVA delete appletInstance;#endif}NodeImpl::Id HTMLAppletElementImpl::id() const{ return ID_APPLET;}bool HTMLAppletElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const{ switch (attr) { case ATTR_WIDTH: case ATTR_HEIGHT: result = eUniversal; return false; case ATTR_ALIGN: result = eReplaced; // Share with <img> since the alignment behavior is the same. return false; default: break; } return HTMLElementImpl::mapToEntry(attr, result);}void HTMLAppletElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr){ switch (attr->id()) { case ATTR_ALT: case ATTR_ARCHIVE: case ATTR_CODE: case ATTR_CODEBASE: case ATTR_MAYSCRIPT: case ATTR_NAME: case ATTR_OBJECT: break; case ATTR_WIDTH: addCSSLength(attr, CSS_PROP_WIDTH, attr->value()); break; case ATTR_HEIGHT: addCSSLength(attr, CSS_PROP_HEIGHT, attr->value()); break; case ATTR_ALIGN: addHTMLAlignment(attr); break; default: HTMLElementImpl::parseHTMLAttribute(attr); }}bool HTMLAppletElementImpl::rendererIsNeeded(RenderStyle *style){ return !getAttribute(ATTR_CODE).isNull();}RenderObject *HTMLAppletElementImpl::createRenderer(RenderArena *arena, RenderStyle *style){#if !defined(Q_WS_QWS) || !KWIQ_NO_APPLET // FIXME(E)? I don't think this is possible with Qt Embedded... KHTMLPart *part = getDocument()->part(); if( part && part->javaEnabled() ) { QMap<QString, QString> args; args.insert( "code", getAttribute(ATTR_CODE).string()); DOMString codeBase = getAttribute(ATTR_CODEBASE); if(!codeBase.isNull()) args.insert( "codeBase", codeBase.string() ); DOMString name = getDocument()->htmlMode() != DocumentImpl::XHtml ? getAttribute(ATTR_NAME) : getAttribute(ATTR_ID); if(!name.isNull()) args.insert( "name", name.string() ); DOMString archive = getAttribute(ATTR_ARCHIVE); if(!archive.isNull()) args.insert( "archive", archive.string() ); args.insert( "baseURL", getDocument()->baseURL() ); DOMString mayScript = getAttribute(ATTR_MAYSCRIPT); if (!mayScript.isNull()) args.insert("mayScript", mayScript.string()); // Other arguments (from <PARAM> tags) are added later. return new (getDocument()->renderArena()) RenderApplet(this, args); } // ### remove me. we should never show an empty applet, instead // render the alternative content given by the webpage return new (getDocument()->renderArena()) RenderEmptyApplet(this);#else return 0;#endif}bool HTMLAppletElementImpl::getMember(const QString & name, JType & type, QString & val) {#if APPLE_CHANGES return false;#else#ifndef Q_WS_QWS // We don't have Java in Qt Embedded if ( !m_render || !m_render->isApplet() ) return false; KJavaAppletWidget *w = static_cast<KJavaAppletWidget*>(static_cast<RenderApplet*>(m_render)->widget()); return (w && w->applet() && w->applet()->getMember(name, type, val));#else return false;#endif#endif}bool HTMLAppletElementImpl::callMember(const QString & name, const QStringList & args, JType & type, QString & val) {#if APPLE_CHANGES return false;#else#ifndef Q_WS_QWS // We don't have Java in Qt Embedded if ( !m_render || !m_render->isApplet() ) return false; KJavaAppletWidget *w = static_cast<KJavaAppletWidget*>(static_cast<RenderApplet*>(m_render)->widget()); return (w && w->applet() && w->applet()->callMember(name, args, type, val));#else return false;#endif#endif}#if APPLE_CHANGES && ! KWIQ_NO_JAVAKJS::Bindings::Instance *HTMLAppletElementImpl::getAppletInstance() const{ KHTMLPart* part = getDocument()->part(); if (!part || !part->javaEnabled()) return 0; if (appletInstance) return appletInstance; RenderApplet *r = static_cast<RenderApplet*>(m_render); if (r) { r->createWidgetIfNecessary(); if (r->widget()){ // Call into the part (and over the bridge) to pull the Bindings::Instance // from the guts of the Java VM. void *_view = r->widget()->getView(); appletInstance = KWQ(part)->getAppletInstanceForView((NSView *)_view); } } return appletInstance;}#endif// -------------------------------------------------------------------------HTMLEmbedElementImpl::HTMLEmbedElementImpl(DocumentPtr *doc) : HTMLElementImpl(doc){}HTMLEmbedElementImpl::~HTMLEmbedElementImpl(){}NodeImpl::Id HTMLEmbedElementImpl::id() const{ return ID_EMBED;}#if APPLE_CHANGES && !KWIQ_NO_JAVAKJS::Bindings::Instance *HTMLEmbedElementImpl::getEmbedInstance() const{ KHTMLPart* part = getDocument()->part(); if (!part) return 0; if (embedInstance) return embedInstance; RenderPartObject *r = static_cast<RenderPartObject*>(m_render); if (r) { if (r->widget()){ // Call into the part (and over the bridge) to pull the Bindings::Instance // from the guts of the Java VM. void *_view = r->widget()->getView(); embedInstance = KWQ(part)->getEmbedInstanceForView((NSView *)_view); } } return embedInstance;}#endifbool HTMLEmbedElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const{ switch (attr) { case ATTR_WIDTH: case ATTR_HEIGHT: case ATTR_BORDER: case ATTR_VSPACE: case ATTR_HSPACE: case ATTR_VALIGN: case ATTR_HIDDEN: result = eUniversal; return false; case ATTR_ALIGN: result = eReplaced; // Share with <img> since the alignment behavior is the same. return false; default: break; } return HTMLElementImpl::mapToEntry(attr, result);}void HTMLEmbedElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr){ QString val = attr->value().string(); int pos; switch ( attr->id() ) { case ATTR_TYPE: serviceType = val.lower(); pos = serviceType.find( ";" ); if ( pos!=-1 ) serviceType = serviceType.left( pos ); break; case ATTR_CODE: case ATTR_SRC: url = khtml::parseURL(attr->value()).string();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -