15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2000 Stefan Schimanski (1Stein@gmx.de)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2011 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLEmbedElement.h"
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSPropertyNames.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLImageLoader.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLObjectElement.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/PluginDocument.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderEmbeddedObject.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h"
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline HTMLEmbedElement::HTMLEmbedElement(const QualifiedName& tagName, Document* document, bool createdByParser)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : HTMLPlugInImageElement(tagName, document, createdByParser, ShouldPreferPlugInsForImages)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(hasTagName(embedTag));
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ScriptWrappable::init(this);
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<HTMLEmbedElement> HTMLEmbedElement::create(const QualifiedName& tagName, Document* document, bool createdByParser)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptRef(new HTMLEmbedElement(tagName, document, createdByParser));
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochstatic inline RenderWidget* findWidgetRenderer(const Node* n)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!n->renderer())
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        do
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            n = n->parentNode();
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (n && !n->hasTagName(objectTag));
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (n && n->renderer() && n->renderer()->isWidget())
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return toRenderWidget(n->renderer());
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderWidget* HTMLEmbedElement::renderWidgetForJSBindings() const
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document()->updateLayoutIgnorePendingStylesheets();
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return findWidgetRenderer(this);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLEmbedElement::isPresentationAttribute(const QualifiedName& name) const
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == hiddenAttr)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLPlugInImageElement::isPresentationAttribute(name);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLEmbedElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == hiddenAttr) {
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (equalIgnoringCase(value, "yes") || equalIgnoringCase(value, "true")) {
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            addPropertyToPresentationAttributeStyle(style, CSSPropertyWidth, 0, CSSPrimitiveValue::CSS_PX);
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            addPropertyToPresentationAttributeStyle(style, CSSPropertyHeight, 0, CSSPrimitiveValue::CSS_PX);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLPlugInImageElement::collectStyleForPresentationAttribute(name, value, style);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLEmbedElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == typeAttr) {
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_serviceType = value.string().lower();
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size_t pos = m_serviceType.find(";");
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pos != notFound)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_serviceType = m_serviceType.left(pos);
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == codeAttr)
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_url = stripLeadingAndTrailingHTMLSpaces(value);
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == srcAttr) {
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_url = stripLeadingAndTrailingHTMLSpaces(value);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (renderer() && isImageType()) {
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!m_imageLoader)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_imageLoader = adoptPtr(new HTMLImageLoader(this));
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_imageLoader->updateFromElementIgnoringPreviousError();
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLPlugInImageElement::parseAttribute(name, value);
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLEmbedElement::parametersForPlugin(Vector<String>& paramNames, Vector<String>& paramValues)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasAttributes())
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < attributeCount(); ++i) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const Attribute* attribute = attributeItem(i);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        paramNames.append(attribute->localName().string());
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        paramValues.append(attribute->value().string());
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: This should be unified with HTMLObjectElement::updateWidget and
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// moved down into HTMLPluginImageElement.cpp
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLEmbedElement::updateWidget(PluginCreationOption pluginCreationOption)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!renderEmbeddedObject()->showsUnavailablePluginIndicator());
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(needsWidgetUpdate());
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsWidgetUpdate(false);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_url.isEmpty() && m_serviceType.isEmpty())
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Note these pass m_url and m_serviceType to allow better code sharing with
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // <object> which modifies url and serviceType before calling these.
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!allowedToLoadFrameURL(m_url))
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: It's sadness that we have this special case here.
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //        See http://trac.webkit.org/changeset/25128 and
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //        plugins/netscape-plugin-setwindow-size.html
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginCreationOption == CreateOnlyNonNetscapePlugins && wouldLoadAsNetscapePlugin(m_url, m_serviceType)) {
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ensure updateWidget() is called again during layout to create the Netscape plug-in.
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsWidgetUpdate(true);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: These should be joined into a PluginParameters class.
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> paramNames;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> paramValues;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parametersForPlugin(paramNames, paramValues);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<HTMLEmbedElement> protect(this); // Loading the plugin might remove us from the document.
15553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool beforeLoadAllowedLoad = dispatchBeforeLoadEvent(m_url);
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!beforeLoadAllowedLoad) {
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (document()->isPluginDocument()) {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Plugins inside plugin documents load differently than other plugins. By the time
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // we are here in a plugin document, the load of the plugin (which is the plugin document's
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // main resource) has already started. We need to explicitly cancel the main resource load here.
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            toPluginDocument(document())->cancelManualPluginLoad();
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer()) // Do not load the plugin if beforeload removed this element or its renderer.
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: beforeLoad could have detached the renderer!  Just like in the <object> case above.
169f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    requestObject(m_url, m_serviceType, paramNames, paramValues);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLEmbedElement::rendererIsNeeded(const NodeRenderingContext& context)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isImageType())
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return HTMLPlugInImageElement::rendererIsNeeded(context);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* frame = document()->frame();
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If my parent is an <object> and is not set to use fallback content, I
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // should be ignored and not get a renderer.
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* p = parentNode();
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (p && p->hasTagName(objectTag)) {
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(p->renderer());
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!static_cast<HTMLObjectElement*>(p)->useFallbackContent()) {
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT(!p->renderer()->isEmbeddedObject());
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLPlugInImageElement::rendererIsNeeded(context);
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLEmbedElement::isURLAttribute(const Attribute& attribute) const
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return attribute.name() == srcAttr || HTMLPlugInImageElement::isURLAttribute(attribute);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const AtomicString& HTMLEmbedElement::imageSourceURL() const
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return getAttribute(srcAttr);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLEmbedElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLPlugInImageElement::addSubresourceAttributeURLs(urls);
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addSubresourceURL(urls, document()->completeURL(getAttribute(srcAttr)));
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
212