HTMLAppletElement.cpp [plain text]
#include "config.h"
#include "HTMLAppletElement.h"
#include "Attribute.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "HTMLDocument.h"
#include "HTMLNames.h"
#include "HTMLParamElement.h"
#include "RenderApplet.h"
#include "SecurityOrigin.h"
#include "Settings.h"
#include "Widget.h"
namespace WebCore {
using namespace HTMLNames;
HTMLAppletElement::HTMLAppletElement(const QualifiedName& tagName, Document* document, bool createdByParser)
: HTMLPlugInImageElement(tagName, document, createdByParser, ShouldNotPreferPlugInsForImages)
{
ASSERT(hasTagName(appletTag));
m_serviceType = "application/x-java-applet";
}
PassRefPtr<HTMLAppletElement> HTMLAppletElement::create(const QualifiedName& tagName, Document* document, bool createdByParser)
{
return adoptRef(new HTMLAppletElement(tagName, document, createdByParser));
}
void HTMLAppletElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
{
if (name == altAttr
|| name == archiveAttr
|| name == codeAttr
|| name == codebaseAttr
|| name == mayscriptAttr
|| name == objectAttr) {
return;
}
HTMLPlugInImageElement::parseAttribute(name, value);
}
bool HTMLAppletElement::rendererIsNeeded(const NodeRenderingContext& context)
{
if (!fastHasAttribute(codeAttr))
return false;
return HTMLPlugInImageElement::rendererIsNeeded(context);
}
RenderObject* HTMLAppletElement::createRenderer(RenderArena*, RenderStyle* style)
{
if (!canEmbedJava())
return RenderObject::createObject(this, style);
return new (document()->renderArena()) RenderApplet(this);
}
RenderWidget* HTMLAppletElement::renderWidgetForJSBindings() const
{
if (!canEmbedJava())
return 0;
document()->updateLayoutIgnorePendingStylesheets();
return renderPart();
}
void HTMLAppletElement::updateWidget(PluginCreationOption)
{
setNeedsWidgetUpdate(false);
if (!isFinishedParsingChildren())
return;
#if !PLATFORM(IOS)
RenderEmbeddedObject* renderer = renderEmbeddedObject();
LayoutUnit contentWidth = renderer->style()->width().isFixed() ? LayoutUnit(renderer->style()->width().value()) :
renderer->width() - renderer->borderAndPaddingWidth();
LayoutUnit contentHeight = renderer->style()->height().isFixed() ? LayoutUnit(renderer->style()->height().value()) :
renderer->height() - renderer->borderAndPaddingHeight();
Vector<String> paramNames;
Vector<String> paramValues;
paramNames.append("code");
paramValues.append(getAttribute(codeAttr).string());
const AtomicString& codeBase = getAttribute(codebaseAttr);
if (!codeBase.isNull()) {
paramNames.append("codeBase");
paramValues.append(codeBase.string());
}
const AtomicString& name = document()->isHTMLDocument() ? getNameAttribute() : getIdAttribute();
if (!name.isNull()) {
paramNames.append("name");
paramValues.append(name.string());
}
const AtomicString& archive = getAttribute(archiveAttr);
if (!archive.isNull()) {
paramNames.append("archive");
paramValues.append(archive.string());
}
paramNames.append("baseURL");
paramValues.append(document()->baseURL().string());
const AtomicString& mayScript = getAttribute(mayscriptAttr);
if (!mayScript.isNull()) {
paramNames.append("mayScript");
paramValues.append(mayScript.string());
}
for (Node* child = firstChild(); child; child = child->nextSibling()) {
if (!child->hasTagName(paramTag))
continue;
HTMLParamElement* param = static_cast<HTMLParamElement*>(child);
if (param->name().isEmpty())
continue;
paramNames.append(param->name());
paramValues.append(param->value());
}
Frame* frame = document()->frame();
ASSERT(frame);
renderer->setWidget(frame->loader()->subframeLoader()->createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), this, paramNames, paramValues));
#endif // !PLATFORM(IOS)
}
bool HTMLAppletElement::canEmbedJava() const
{
if (document()->isSandboxed(SandboxPlugins))
return false;
Settings* settings = document()->settings();
if (!settings)
return false;
if (!settings->isJavaEnabled())
return false;
if (document()->securityOrigin()->isLocal() && !settings->isJavaEnabledForLocalFiles())
return false;
return true;
}
}