[3603191] REGRESSION: Applets not receiving all of the Applet Parameters in Java...
[WebKit-https.git] / WebCore / khtml / rendering / render_applet.cpp
1 /**
2  * This file is part of the HTML widget for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  * Copyright (C) 2003 Apple Computer, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  *
22  */
23 #include <config.h>
24 #include <klocale.h>
25
26 #include <kdebug.h>
27
28 #include "rendering/render_applet.h"
29 #include "rendering/render_canvas.h"
30 #include "xml/dom_docimpl.h"
31 #include "khtmlview.h"
32 #include "khtml_part.h"
33
34 #include <qlabel.h>
35
36 #ifndef Q_WS_QWS // We don't have Java in Qt Embedded
37
38 #include "java/kjavaappletwidget.h"
39 #include "misc/htmltags.h"
40 #include "html/html_objectimpl.h"
41
42 using namespace khtml;
43 using namespace DOM;
44
45 RenderApplet::RenderApplet(HTMLElementImpl *applet, const QMap<QString, QString> &args )
46     : RenderWidget(applet)
47 {
48     // init RenderObject attributes
49     setInline(true);
50
51     KJavaAppletContext *context = 0;
52     KHTMLPart *part = applet->getDocument()->part();
53     if ( part ) {
54         context = part->createJavaContext();
55     }
56
57 #if APPLE_CHANGES
58     m_context = context;
59     m_args = args;
60 #else
61     if ( context ) {
62         //kdDebug(6100) << "RenderApplet::RenderApplet, setting QWidget" << endl;
63         setQWidget( new KJavaAppletWidget(context, _view->viewport()) );
64         processArguments(args);
65     }
66 #endif
67 }
68
69 RenderApplet::~RenderApplet()
70 {
71 }
72
73 int RenderApplet::intrinsicWidth() const
74 {
75     int rval = 150;
76
77     if( m_widget )
78         rval = ((KJavaAppletWidget*)(m_widget))->sizeHint().width();
79
80     return rval > 10 ? rval : 50;
81 }
82
83 int RenderApplet::intrinsicHeight() const
84 {
85     int rval = 150;
86
87     if( m_widget )
88         rval = m_widget->sizeHint().height();
89
90     return rval > 10 ? rval : 50;
91 }
92
93 void RenderApplet::createWidgetIfNecessary()
94 {
95     if (!m_widget) {
96         if (static_cast<HTMLAppletElementImpl*>(element())->allParamsAvailable()) {
97             // FIXME: Java applets can't be resized (this is a bug in Apple's Java implementation).  In order to work around
98             // this problem, we will simply use fixed widths/heights from the style system when we can, since the widget might
99             // not have an accurate m_width/m_height.
100             int width = style()->width().isFixed() ? style()->width().value : 
101                         m_width - borderLeft() - borderRight() - paddingLeft() - paddingRight();
102             int height = style()->height().isFixed() ? style()->height().value :
103                          m_height - borderTop() - borderBottom() - paddingTop() - paddingBottom();
104             NodeImpl *child = element()->firstChild();
105             while (child) {
106                 if (child->id() == ID_PARAM) {
107                     HTMLParamElementImpl *p = static_cast<HTMLParamElementImpl *>(child);
108                     m_args.insert(p->name(), p->value());
109                 }
110                 child = child->nextSibling();
111             }
112         
113             setQWidget(new KJavaAppletWidget(QSize(width, height), m_context, m_args));
114         }
115     }
116 }
117
118 void RenderApplet::layout()
119 {
120     //kdDebug(6100) << "RenderApplet::layout" << endl;
121
122     KHTMLAssert( needsLayout() );
123     KHTMLAssert( minMaxKnown() );
124
125     calcWidth();
126     calcHeight();
127
128     KJavaAppletWidget *tmp = static_cast<KJavaAppletWidget*>(m_widget);
129 #if APPLE_CHANGES
130     // The applet's QWidget gets created lazily upon first layout.
131     if (!tmp)
132         createWidgetIfNecessary();
133 #else 
134     if ( tmp ) {
135         NodeImpl *child = element()->firstChild();
136
137         while(child) {
138
139             if(child->id() == ID_PARAM) {
140                 HTMLParamElementImpl *p = static_cast<HTMLParamElementImpl *>(child);
141                 if(tmp->applet())
142                     tmp->applet()->setParameter( p->name(), p->value());
143             }
144             child = child->nextSibling();
145         }
146         //kdDebug(6100) << "setting applet widget to size: " << m_width << ", " << m_height << endl;
147         m_widget->resize(m_width - borderLeft() - borderRight() - paddingLeft() - paddingRight(),
148                          m_height - borderTop() - borderBottom() - paddingTop() - paddingBottom());
149         tmp->showApplet();
150     }
151 #endif
152     setNeedsLayout(false);
153 }
154
155 #if !APPLE_CHANGES
156 void RenderApplet::processArguments(const QMap<QString, QString> &args)
157 {
158     KJavaAppletWidget *w = static_cast<KJavaAppletWidget*>(m_widget);
159     KJavaApplet* applet = w ? w->applet() : 0;
160
161     if ( applet ) {
162         applet->setBaseURL( args[QString::fromLatin1("baseURL") ] );
163         applet->setAppletClass( args[QString::fromLatin1("code") ] );
164
165         QString str = args[QString::fromLatin1("codeBase") ];
166         if( !str.isEmpty() )
167             applet->setCodeBase( str );
168
169         str = args[QString::fromLatin1("name") ];
170         if( !str.isNull() )
171             applet->setAppletName( str );
172         else
173             applet->setAppletName( args[QString::fromLatin1("code") ] );
174
175         str = args[QString::fromLatin1("archive") ];
176         if( !str.isEmpty() ) 
177             applet->setArchives( args[QString::fromLatin1("archive") ] );
178     }
179 }
180 #endif
181
182 RenderEmptyApplet::RenderEmptyApplet(DOM::NodeImpl* node)
183   : RenderWidget(node)
184 {
185     // init RenderObject attributes
186     setInline(true);
187
188 #if APPLE_CHANGES
189     // FIXME: Figure out how to handle this.
190 #else
191     QLabel* label = new QLabel(i18n("Java Applet is not loaded. (Java interpreter disabled)"), node->getDocument()->view()->viewport());
192     label->setAlignment( Qt::AlignCenter | Qt::WordBreak );
193     setQWidget(label);
194 #endif
195 }
196
197 int RenderEmptyApplet::intrinsicWidth() const
198 {
199     return (m_widget ? m_widget->sizeHint().width() : 150);
200 }
201
202 int RenderEmptyApplet::intrinsicHeight() const
203 {
204     return (m_widget ? m_widget->sizeHint().height() : 150);
205 }
206
207 void RenderEmptyApplet::layout()
208 {
209     KHTMLAssert( needsLayout() );
210     KHTMLAssert( minMaxKnown() );
211
212     calcWidth();
213     calcHeight();
214
215     // updateWidgetPositions will size the widget, so we don't need to do that here.
216 #if !APPLE_CHANGES
217     if(m_widget)
218     {
219         //kdDebug(6100) << "RenderEmptyApplet::layout, m_width = " << m_width << ", m_height = " << m_height << endl;
220         m_widget->resize(m_width-borderLeft()-borderRight()-paddingLeft()-paddingRight(),
221                          m_height-borderTop()-borderBottom()-paddingTop()-paddingBottom());
222     }
223 #endif
224     
225     setNeedsLayout(false);
226 }
227 #endif