This source file includes following definitions.
- create
- findWidgetRenderer
- existingRenderWidget
- isPresentationAttribute
- collectStyleForPresentationAttribute
- parseAttribute
- parametersForPlugin
- updateWidgetInternal
- rendererIsNeeded
- isURLAttribute
- subResourceAttributeName
- imageSourceURL
- isInteractiveContent
- isExposed
#include "config.h"
#include "core/html/HTMLEmbedElement.h"
#include "CSSPropertyNames.h"
#include "HTMLNames.h"
#include "core/dom/Attribute.h"
#include "core/dom/shadow/ShadowRoot.h"
#include "core/html/HTMLImageLoader.h"
#include "core/html/HTMLObjectElement.h"
#include "core/html/PluginDocument.h"
#include "core/html/parser/HTMLParserIdioms.h"
#include "core/rendering/RenderEmbeddedObject.h"
#include "core/rendering/RenderWidget.h"
namespace WebCore {
using namespace HTMLNames;
inline HTMLEmbedElement::HTMLEmbedElement(Document& document, bool createdByParser)
: HTMLPlugInElement(embedTag, document, createdByParser, ShouldPreferPlugInsForImages)
{
ScriptWrappable::init(this);
}
PassRefPtr<HTMLEmbedElement> HTMLEmbedElement::create(Document& document, bool createdByParser)
{
RefPtr<HTMLEmbedElement> element = adoptRef(new HTMLEmbedElement(document, createdByParser));
element->ensureUserAgentShadowRoot();
return element.release();
}
static inline RenderWidget* findWidgetRenderer(const Node* n)
{
if (!n->renderer())
n = Traversal<HTMLObjectElement>::firstAncestor(*n);
if (n && n->renderer() && n->renderer()->isWidget())
return toRenderWidget(n->renderer());
return 0;
}
RenderWidget* HTMLEmbedElement::existingRenderWidget() const
{
return findWidgetRenderer(this);
}
bool HTMLEmbedElement::isPresentationAttribute(const QualifiedName& name) const
{
if (name == hiddenAttr)
return true;
return HTMLPlugInElement::isPresentationAttribute(name);
}
void HTMLEmbedElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
{
if (name == hiddenAttr) {
if (equalIgnoringCase(value, "yes") || equalIgnoringCase(value, "true")) {
addPropertyToPresentationAttributeStyle(style, CSSPropertyWidth, 0, CSSPrimitiveValue::CSS_PX);
addPropertyToPresentationAttributeStyle(style, CSSPropertyHeight, 0, CSSPrimitiveValue::CSS_PX);
}
} else {
HTMLPlugInElement::collectStyleForPresentationAttribute(name, value, style);
}
}
void HTMLEmbedElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
{
if (name == typeAttr) {
m_serviceType = value.string().lower();
size_t pos = m_serviceType.find(";");
if (pos != kNotFound)
m_serviceType = m_serviceType.left(pos);
if (!renderer())
requestPluginCreationWithoutRendererIfPossible();
} else if (name == codeAttr) {
m_url = stripLeadingAndTrailingHTMLSpaces(value);
} else if (name == srcAttr) {
m_url = stripLeadingAndTrailingHTMLSpaces(value);
if (renderer() && isImageType()) {
if (!m_imageLoader)
m_imageLoader = adoptPtr(new HTMLImageLoader(this));
m_imageLoader->updateFromElementIgnoringPreviousError();
}
} else {
HTMLPlugInElement::parseAttribute(name, value);
}
}
void HTMLEmbedElement::parametersForPlugin(Vector<String>& paramNames, Vector<String>& paramValues)
{
if (!hasAttributes())
return;
unsigned attributeCount = this->attributeCount();
for (unsigned i = 0; i < attributeCount; ++i) {
const Attribute& attribute = attributeItem(i);
paramNames.append(attribute.localName().string());
paramValues.append(attribute.value().string());
}
}
void HTMLEmbedElement::updateWidgetInternal()
{
ASSERT(!renderEmbeddedObject()->showsUnavailablePluginIndicator());
ASSERT(needsWidgetUpdate());
setNeedsWidgetUpdate(false);
if (m_url.isEmpty() && m_serviceType.isEmpty())
return;
if (!allowedToLoadFrameURL(m_url))
return;
Vector<String> paramNames;
Vector<String> paramValues;
parametersForPlugin(paramNames, paramValues);
RefPtr<HTMLEmbedElement> protect(this);
if (!renderer())
return;
requestObject(m_url, m_serviceType, paramNames, paramValues);
}
bool HTMLEmbedElement::rendererIsNeeded(const RenderStyle& style)
{
if (isImageType())
return HTMLPlugInElement::rendererIsNeeded(style);
LocalFrame* frame = document().frame();
if (!frame)
return false;
ContainerNode* p = parentNode();
if (isHTMLObjectElement(p)) {
ASSERT(p->renderer());
if (!toHTMLObjectElement(p)->useFallbackContent()) {
ASSERT(!p->renderer()->isEmbeddedObject());
return false;
}
}
return HTMLPlugInElement::rendererIsNeeded(style);
}
bool HTMLEmbedElement::isURLAttribute(const Attribute& attribute) const
{
return attribute.name() == srcAttr || HTMLPlugInElement::isURLAttribute(attribute);
}
const QualifiedName& HTMLEmbedElement::subResourceAttributeName() const
{
return srcAttr;
}
const AtomicString HTMLEmbedElement::imageSourceURL() const
{
return getAttribute(srcAttr);
}
bool HTMLEmbedElement::isInteractiveContent() const
{
return true;
}
bool HTMLEmbedElement::isExposed() const
{
for (HTMLObjectElement* object = Traversal<HTMLObjectElement>::firstAncestor(*this); object; object = Traversal<HTMLObjectElement>::firstAncestor(*object)) {
if (object->isExposed())
return false;
}
return true;
}
}