JavaScriptCore:
[WebKit-https.git] / WebCore / bindings / js / JSImageConstructor.cpp
1 /*
2  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #include "config.h"
21 #include "JSImageConstructor.h"
22
23 #include "HTMLImageElement.h"
24 #include "JSNode.h"
25 #include "ScriptExecutionContext.h"
26
27 using namespace JSC;
28
29 namespace WebCore {
30
31 ASSERT_CLASS_FITS_IN_CELL(JSImageConstructor)
32
33 const ClassInfo JSImageConstructor::s_info = { "ImageConstructor", 0, 0, 0 };
34
35 JSImageConstructor::JSImageConstructor(ExecState* exec, ScriptExecutionContext* context)
36     : DOMObject(JSImageConstructor::createStructure(exec->lexicalGlobalObject()->objectPrototype()))
37 {
38     ASSERT(context->isDocument());
39     m_document = static_cast<JSDocument*>(asObject(toJS(exec, static_cast<Document*>(context))));
40 }
41
42 static JSObject* constructImage(ExecState* exec, JSObject* constructor, const ArgList& args)
43 {
44     bool widthSet = false;
45     bool heightSet = false;
46     int width = 0;
47     int height = 0;
48     if (args.size() > 0) {
49         widthSet = true;
50         width = args.at(exec, 0)->toInt32(exec);
51     }
52     if (args.size() > 1) {
53         heightSet = true;
54         height = args.at(exec, 1)->toInt32(exec);
55     }
56
57     Document* document = static_cast<JSImageConstructor*>(constructor)->document();
58
59     // Calling toJS on the document causes the JS document wrapper to be
60     // added to the window object. This is done to ensure that JSDocument::mark
61     // will be called (which will cause the image element to be marked if necessary).
62     toJS(exec, document);
63
64     RefPtr<HTMLImageElement> image = new HTMLImageElement(document);
65     if (widthSet)
66         image->setWidth(width);
67     if (heightSet)
68         image->setHeight(height);
69     return asObject(toJS(exec, image.release()));
70 }
71
72 ConstructType JSImageConstructor::getConstructData(ConstructData& constructData)
73 {
74     constructData.native.function = constructImage;
75     return ConstructTypeHost;
76 }
77
78 void JSImageConstructor::mark()
79 {
80     DOMObject::mark();
81     if (!m_document->marked())
82         m_document->mark();
83 }
84
85 } // namespace WebCore