HTMLAppletElement.cpp [plain text]
#include "config.h"
#include "HTMLAppletElement.h"
#include "ElementIterator.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "HTMLDocument.h"
#include "HTMLNames.h"
#include "HTMLParamElement.h"
#include "RenderEmbeddedObject.h"
#include "SecurityOrigin.h"
#include "Settings.h"
#include "SubframeLoader.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 RenderStyle& style)
{
if (!fastHasAttribute(codeAttr))
return false;
return HTMLPlugInImageElement::rendererIsNeeded(style);
}
RenderPtr<RenderElement> HTMLAppletElement::createElementRenderer(PassRef<RenderStyle> style)
{
if (!canEmbedJava())
return RenderElement::createFor(*this, WTF::move(style));
return RenderEmbeddedObject::createForApplet(*this, WTF::move(style));
}
RenderWidget* HTMLAppletElement::renderWidgetForJSBindings() const
{
if (!canEmbedJava())
return 0;
document().updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasksSynchronously);
return renderWidget();
}
void HTMLAppletElement::updateWidget(PluginCreationOption pluginCreationOption)
{
setNeedsWidgetUpdate(false);
if (!isFinishedParsingChildren())
return;
#if PLATFORM(IOS)
UNUSED_PARAM(pluginCreationOption);
#else
if (pluginCreationOption == CreateOnlyNonNetscapePlugins) {
setNeedsWidgetUpdate(true);
return;
}
RenderEmbeddedObject* renderer = renderEmbeddedObject();
LayoutUnit contentWidth = renderer->style().width().isFixed() ? LayoutUnit(renderer->style().width().value()) :
renderer->width() - renderer->horizontalBorderAndPaddingExtent();
LayoutUnit contentHeight = renderer->style().height().isFixed() ? LayoutUnit(renderer->style().height().value()) :
renderer->height() - renderer->verticalBorderAndPaddingExtent();
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 (auto& param : childrenOfType<HTMLParamElement>(*this)) {
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;
}
}