diff options
Diffstat (limited to 'webkit/pending/RenderPartObject.cpp')
-rw-r--r-- | webkit/pending/RenderPartObject.cpp | 342 |
1 files changed, 0 insertions, 342 deletions
diff --git a/webkit/pending/RenderPartObject.cpp b/webkit/pending/RenderPartObject.cpp deleted file mode 100644 index 86ea516..0000000 --- a/webkit/pending/RenderPartObject.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright (C) 1999 Lars Knoll (knoll@kde.org) - * (C) 2000 Simon Hausmann <hausmann@kde.org> - * (C) 2000 Stefan Schimanski (1Stein@gmx.de) - * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. - * - * 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 "config.h" -#include "RenderPartObject.h" - -#include "Frame.h" -#include "FrameLoader.h" -#include "FrameLoaderClient.h" -#include "FrameTree.h" -#include "FrameView.h" -#include "HTMLEmbedElement.h" -#include "HTMLIFrameElement.h" -#include "HTMLNames.h" -#include "HTMLObjectElement.h" -#include "HTMLParamElement.h" -#include "MIMETypeRegistry.h" -#include "Page.h" -#include "Text.h" - -namespace WebCore { - -using namespace HTMLNames; - -RenderPartObject::RenderPartObject(HTMLFrameOwnerElement* element) - : RenderPart(element) -{ - // init RenderObject attributes - setInline(true); - m_hasFallbackContent = false; -} - -RenderPartObject::~RenderPartObject() -{ - if (m_view) - m_view->removeWidgetToUpdate(this); -} - -static bool isURLAllowed(Document* doc, const String& url) -{ - if (doc->frame()->page()->frameCount() >= 200) - return false; - - // We allow one level of self-reference because some sites depend on that. - // But we don't allow more than one. - KURL completeURL = doc->completeURL(url); - bool foundSelfReference = false; - for (Frame* frame = doc->frame(); frame; frame = frame->tree()->parent()) { - if (equalIgnoringRef(frame->loader()->url(), completeURL)) { - if (foundSelfReference) - return false; - foundSelfReference = true; - } - } - return true; -} - -static inline void mapClassIdToServiceType(const String& classId, String& serviceType) -{ - // It is ActiveX, but the nsplugin system handling - // should also work, that's why we don't override the - // serviceType with application/x-oleobject - // but let the KTrader in khtmlpart::createPart() detect - // the user's preference: launch with activex viewer or - // with nspluginviewer (Niko) -#ifndef DISABLE_ACTIVEX_TYPE_CONVERSION_FLASH - if (classId.contains("D27CDB6E-AE6D-11cf-96B8-444553540000", false)) { - serviceType = "application/x-shockwave-flash"; - return; - } -#endif -#ifndef DISABLE_ACTIVEX_TYPE_CONVERSION_REALAUDIO - if (classId.contains("CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA", false)) { - serviceType = "audio/x-pn-realaudio-plugin"; - return; - } -#endif -#ifndef DISABLE_ACTIVEX_TYPE_CONVERSION_QUICKTIME - if (classId.contains("02BF25D5-8C17-4B23-BC80-D3488ABDDC6B", false)) { - serviceType = "video/quicktime"; - return; - } -#endif -#ifndef DISABLE_ACTIVEX_TYPE_CONVERSION_DIRECTOR - if (classId.contains("166B1BCA-3F9C-11CF-8075-444553540000", false)) { - serviceType = "application/x-director"; - return; - } -#endif -#ifndef DISABLE_ACTIVEX_TYPE_CONVERSION_MPLAYER2 - if (classId.contains("6BF52A52-394A-11d3-B153-00C04F79FAA6", false)) { - serviceType = "application/x-mplayer2"; - return; - } -#endif - // TODO: add more plugins here - - if (!classId.isEmpty()) { - // We have a clsid, means this is activex (Niko) - serviceType = "application/x-oleobject"; - } -} - -// By default, when an Object element contains an embed tag, we will try to -// create a plugin for the embed tag. However we will not do this for Windows -// media object because our internal ActiveX plugin supports scripting and -// some websites rely on that. The default npdsplay.dll plugin doesn't support -// scripting. -static bool ShouldUseEmbedForObject(HTMLObjectElement* o) -{ -#ifndef DISABLE_ACTIVEX_TYPE_CONVERSION_MPLAYER2 - return true; -#endif - NamedAttrMap* attributes = o->attributes(); - if (attributes) { - for (unsigned i = 0; i < attributes->length(); ++i) { - Attribute* it = attributes->attributeItem(i); - if (it->name().localName().string().foldCase() == "classid") { - // If it's windows media player type. - if (it->value().contains("6BF52A52-394A-11d3-B153-00C04F79FAA6", false) || - it->value().contains("22D6F312-B0F6-11D0-94AB-0080C74C7E95", false)) - return false; - } - } - } - return true; -} - -void RenderPartObject::updateWidget(bool onlyCreateNonNetscapePlugins) -{ - String url; - String serviceType; - Vector<String> paramNames; - Vector<String> paramValues; - Frame* frame = m_view->frame(); - - if (element()->hasTagName(objectTag)) { - - HTMLObjectElement* o = static_cast<HTMLObjectElement*>(element()); - - o->setNeedWidgetUpdate(false); - if (!o->isFinishedParsingChildren()) - return; - // Check for a child EMBED tag. - HTMLEmbedElement* embed = 0; - if (ShouldUseEmbedForObject(o)) { - for (Node* child = o->firstChild(); child;) { - if (child->hasTagName(embedTag)) { - embed = static_cast<HTMLEmbedElement*>(child); - break; - } else if (child->hasTagName(objectTag)) - child = child->nextSibling(); // Don't descend into nested OBJECT tags - else - child = child->traverseNextNode(o); // Otherwise descend (EMBEDs may be inside COMMENT tags) - } - } - // Use the attributes from the EMBED tag instead of the OBJECT tag including WIDTH and HEIGHT. - HTMLElement *embedOrObject; - if (embed) { - embedOrObject = (HTMLElement *)embed; - url = embed->url(); - serviceType = embed->serviceType(); - } else - embedOrObject = (HTMLElement *)o; - - // If there was no URL or type defined in EMBED, try the OBJECT tag. - if (url.isEmpty()) - url = o->url(); - if (serviceType.isEmpty()) - serviceType = o->serviceType(); - - HashSet<StringImpl*, CaseFoldingHash> uniqueParamNames; - - // Scan the PARAM children. - // Get the URL and type from the params if we don't already have them. - // Get the attributes from the params if there is no EMBED tag. - Node *child = o->firstChild(); - while (child && (url.isEmpty() || serviceType.isEmpty() || !embed)) { - if (child->hasTagName(paramTag)) { - HTMLParamElement* p = static_cast<HTMLParamElement*>(child); - String name = p->name(); - if (url.isEmpty() && (equalIgnoringCase(name, "src") || equalIgnoringCase(name, "movie") || equalIgnoringCase(name, "code") || equalIgnoringCase(name, "url"))) - url = p->value(); - if (serviceType.isEmpty() && equalIgnoringCase(name, "type")) { - serviceType = p->value(); - int pos = serviceType.find(";"); - if (pos != -1) - serviceType = serviceType.left(pos); - } - if (!embed && !name.isEmpty()) { - uniqueParamNames.add(name.impl()); - paramNames.append(p->name()); - paramValues.append(p->value()); - } - } - child = child->nextSibling(); - } - - // When OBJECT is used for an applet via Sun's Java plugin, the CODEBASE attribute in the tag - // points to the Java plugin itself (an ActiveX component) while the actual applet CODEBASE is - // in a PARAM tag. See <http://java.sun.com/products/plugin/1.2/docs/tags.html>. This means - // we have to explicitly suppress the tag's CODEBASE attribute if there is none in a PARAM, - // else our Java plugin will misinterpret it. [4004531] - String codebase; - if (!embed && MIMETypeRegistry::isJavaAppletMIMEType(serviceType)) { - codebase = "codebase"; - uniqueParamNames.add(codebase.impl()); // pretend we found it in a PARAM already - } - - // Turn the attributes of either the EMBED tag or OBJECT tag into arrays, but don't override PARAM values. - NamedAttrMap* attributes = embedOrObject->attributes(); - if (attributes) { - for (unsigned i = 0; i < attributes->length(); ++i) { - Attribute* it = attributes->attributeItem(i); - const AtomicString& name = it->name().localName(); - if (embed || !uniqueParamNames.contains(name.impl())) { - paramNames.append(name.string()); - paramValues.append(it->value().string()); - } - } - } - - // If we still don't have a type, try to map from a specific CLASSID to a type. - // However, if we have the embed tag we shouldn't do so because the outer object - // may be converted to application/x-oleobject, while we are not getting the paramaters - // including classid etc for the outer object. - if (serviceType.isEmpty() && !o->classId().isEmpty() && !embed) - mapClassIdToServiceType(o->classId(), serviceType); - - if (!isURLAllowed(document(), url)) - return; - - // Find out if we support fallback content. - m_hasFallbackContent = false; - for (Node *child = o->firstChild(); child && !m_hasFallbackContent; child = child->nextSibling()) { - if ((!child->isTextNode() && !child->hasTagName(embedTag) && !child->hasTagName(paramTag)) || // Discount <embed> and <param> - (child->isTextNode() && !static_cast<Text*>(child)->containsOnlyWhitespace())) - m_hasFallbackContent = true; - } - - if (onlyCreateNonNetscapePlugins) { - KURL completedURL; - if (!url.isEmpty()) - completedURL = frame->loader()->completeURL(url); - - if (frame->loader()->client()->objectContentType(completedURL, serviceType) == ObjectContentNetscapePlugin) - return; - } - - bool success = frame->loader()->requestObject(this, url, AtomicString(o->name()), serviceType, paramNames, paramValues); - if (!success && m_hasFallbackContent) - o->renderFallbackContent(); - } else if (element()->hasTagName(embedTag)) { - HTMLEmbedElement *o = static_cast<HTMLEmbedElement*>(element()); - o->setNeedWidgetUpdate(false); - url = o->url(); - serviceType = o->serviceType(); - - if (url.isEmpty() && serviceType.isEmpty()) - return; - if (!isURLAllowed(document(), url)) - return; - - // add all attributes set on the embed object - NamedAttrMap* a = o->attributes(); - if (a) { - for (unsigned i = 0; i < a->length(); ++i) { - Attribute* it = a->attributeItem(i); - paramNames.append(it->name().localName().string()); - paramValues.append(it->value().string()); - } - } - - if (onlyCreateNonNetscapePlugins) { - KURL completedURL; - if (!url.isEmpty()) - completedURL = frame->loader()->completeURL(url); - - if (frame->loader()->client()->objectContentType(completedURL, serviceType) == ObjectContentNetscapePlugin) - return; - - } - - frame->loader()->requestObject(this, url, o->getAttribute(nameAttr), serviceType, paramNames, paramValues); - } -} - -void RenderPartObject::layout() -{ - ASSERT(needsLayout()); - - calcWidth(); - calcHeight(); - adjustOverflowForBoxShadow(); - - RenderPart::layout(); - - if (!m_widget && m_view) - m_view->addWidgetToUpdate(this); - - setNeedsLayout(false); -} - -void RenderPartObject::viewCleared() -{ - if (element() && m_widget && m_widget->isFrameView()) { - FrameView* view = static_cast<FrameView*>(m_widget); - int marginw = -1; - int marginh = -1; - if (element()->hasTagName(iframeTag)) { - HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(element()); - marginw = frame->getMarginWidth(); - marginh = frame->getMarginHeight(); - } - if (marginw != -1) - view->setMarginWidth(marginw); - if (marginh != -1) - view->setMarginHeight(marginh); - } -} - -} |