HTMLAppletElement.cpp 5.86 KB
Newer Older
darin@apple.com's avatar
darin@apple.com committed
1
/*
2
3
4
 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
 *           (C) 2000 Stefan Schimanski (1Stein@gmx.de)
5
 * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2012 Apple Inc. All rights reserved.
6
 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
7
8
9
10
11
12
13
14
15
16
17
18
19
 *
 * 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
ddkilzer's avatar
ddkilzer committed
20
21
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
22
 */
darin@apple.com's avatar
darin@apple.com committed
23

24
25
26
#include "config.h"
#include "HTMLAppletElement.h"

27
#include "ChildIterator.h"
28
#include "Frame.h"
29
#include "FrameLoader.h"
30
31
#include "HTMLDocument.h"
#include "HTMLNames.h"
32
#include "HTMLParamElement.h"
33
#include "RenderApplet.h"
34
#include "SecurityOrigin.h"
ggaren's avatar
ggaren committed
35
#include "Settings.h"
36
#include "Widget.h"
37

38
39
40
41
namespace WebCore {

using namespace HTMLNames;

42
43
HTMLAppletElement::HTMLAppletElement(const QualifiedName& tagName, Document* document, bool createdByParser)
    : HTMLPlugInImageElement(tagName, document, createdByParser, ShouldNotPreferPlugInsForImages)
44
{
45
    ASSERT(hasTagName(appletTag));
46
47

    m_serviceType = "application/x-java-applet";
48
49
}

50
PassRefPtr<HTMLAppletElement> HTMLAppletElement::create(const QualifiedName& tagName, Document* document, bool createdByParser)
51
{
52
    return adoptRef(new HTMLAppletElement(tagName, document, createdByParser));
53
54
}

55
void HTMLAppletElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
56
{
57
58
59
60
61
62
    if (name == altAttr
        || name == archiveAttr
        || name == codeAttr
        || name == codebaseAttr
        || name == mayscriptAttr
        || name == objectAttr) {
63
        // Do nothing.
64
65
66
        return;
    }

67
    HTMLPlugInImageElement::parseAttribute(name, value);
68
69
}

70
bool HTMLAppletElement::rendererIsNeeded(const RenderStyle& style)
71
{
72
    if (!fastHasAttribute(codeAttr))
73
        return false;
74
    return HTMLPlugInImageElement::rendererIsNeeded(style);
75
76
}

77
RenderObject* HTMLAppletElement::createRenderer(RenderArena*, RenderStyle* style)
78
{
79
80
81
82
83
84
    if (!canEmbedJava())
        return RenderObject::createObject(this, style);

    return new (document()->renderArena()) RenderApplet(this);
}

85
RenderWidget* HTMLAppletElement::renderWidgetForJSBindings() const
86
87
88
{
    if (!canEmbedJava())
        return 0;
89

90
91
92
    document()->updateLayoutIgnorePendingStylesheets();
    return renderPart();
}
93

94
void HTMLAppletElement::updateWidget(PluginCreationOption pluginCreationOption)
95
96
97
98
99
{
    setNeedsWidgetUpdate(false);
    // FIXME: This should ASSERT isFinishedParsingChildren() instead.
    if (!isFinishedParsingChildren())
        return;
100

101
102
103
104
105
106
107
108
109
    // FIXME: It's sadness that we have this special case here.
    //        See http://trac.webkit.org/changeset/25128 and
    //        plugins/netscape-plugin-setwindow-size.html
    if (pluginCreationOption == CreateOnlyNonNetscapePlugins) {
        // Ensure updateWidget() is called again during layout to create the Netscape plug-in.
        setNeedsWidgetUpdate(true);
        return;
    }

110
    RenderEmbeddedObject* renderer = renderEmbeddedObject();
111

112
113
114
115
    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();
116

117
118
    Vector<String> paramNames;
    Vector<String> paramValues;
119

120
121
122
123
124
125
    paramNames.append("code");
    paramValues.append(getAttribute(codeAttr).string());

    const AtomicString& codeBase = getAttribute(codebaseAttr);
    if (!codeBase.isNull()) {
        paramNames.append("codeBase");
126
        paramValues.append(codeBase.string());
127
128
    }

129
130
131
    const AtomicString& name = document()->isHTMLDocument() ? getNameAttribute() : getIdAttribute();
    if (!name.isNull()) {
        paramNames.append("name");
132
        paramValues.append(name.string());
133
    }
134

135
136
137
    const AtomicString& archive = getAttribute(archiveAttr);
    if (!archive.isNull()) {
        paramNames.append("archive");
138
        paramValues.append(archive.string());
139
    }
140

141
142
    paramNames.append("baseURL");
    paramValues.append(document()->baseURL().string());
143

144
145
146
    const AtomicString& mayScript = getAttribute(mayscriptAttr);
    if (!mayScript.isNull()) {
        paramNames.append("mayScript");
147
        paramValues.append(mayScript.string());
148
149
    }

150
151
    auto paramChildren = childrenOfType<HTMLParamElement>(this);
    for (auto param = paramChildren.begin(), end = paramChildren.end(); param != end; ++param) {
152
153
154
155
156
157
        if (param->name().isEmpty())
            continue;

        paramNames.append(param->name());
        paramValues.append(param->value());
    }
158

159
160
161
    Frame* frame = document()->frame();
    ASSERT(frame);

162
    renderer->setWidget(frame->loader().subframeLoader()->createJavaAppletWidget(roundedIntSize(LayoutSize(contentWidth, contentHeight)), this, paramNames, paramValues));
163
164
}

165
166
bool HTMLAppletElement::canEmbedJava() const
{
167
    if (document()->isSandboxed(SandboxPlugins))
168
169
170
        return false;

    Settings* settings = document()->settings();
171
172
173
174
175
176
177
178
179
180
    if (!settings)
        return false;

    if (!settings->isJavaEnabled())
        return false;

    if (document()->securityOrigin()->isLocal() && !settings->isJavaEnabledForLocalFiles())
        return false;

    return true;
181
182
}

183
}