Foo::s_info should be Foo::info(), so that you can change how the s_info is actually...
[WebKit-https.git] / Source / WebCore / bindings / js / JSEventTargetCustom.cpp
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "JSEventTarget.h"
28
29 #include "EventTargetHeaders.h"
30 #include "EventTargetInterfaces.h"
31 #include "JSDOMWindowShell.h"
32 #include "JSEventListener.h"
33
34 using namespace JSC;
35
36 namespace WebCore {
37
38 #define TRY_TO_WRAP_WITH_INTERFACE(interfaceName) \
39     if (eventNames().interfaceFor##interfaceName == desiredInterface) \
40         return toJS(exec, globalObject, static_cast<interfaceName*>(target));
41
42 JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, EventTarget* target)
43 {
44     if (!target)
45         return jsNull();
46
47     AtomicString desiredInterface = target->interfaceName();
48
49     // FIXME: Why can't we use toJS for these cases?
50 #if ENABLE(WORKERS)
51     if (eventNames().interfaceForDedicatedWorkerGlobalScope == desiredInterface)
52         return toJSDOMGlobalObject(static_cast<DedicatedWorkerGlobalScope*>(target), exec);
53 #endif
54 #if ENABLE(SHARED_WORKERS)
55     if (eventNames().interfaceForSharedWorkerGlobalScope == desiredInterface)
56         return toJSDOMGlobalObject(static_cast<SharedWorkerGlobalScope*>(target), exec);
57 #endif
58
59     DOM_EVENT_TARGET_INTERFACES_FOR_EACH(TRY_TO_WRAP_WITH_INTERFACE)
60
61     ASSERT_NOT_REACHED();
62     return jsNull();
63 }
64
65 #undef TRY_TO_WRAP_WITH_INTERFACE
66
67 #define TRY_TO_UNWRAP_WITH_INTERFACE(interfaceName) \
68     if (value.inherits(JS##interfaceName::info()))                      \
69         return static_cast<interfaceName*>(jsCast<JS##interfaceName*>(asObject(value))->impl());
70
71 EventTarget* toEventTarget(JSC::JSValue value)
72 {
73     if (value.inherits(JSDOMWindowShell::info()))
74         return jsCast<JSDOMWindowShell*>(asObject(value))->impl();
75
76     TRY_TO_UNWRAP_WITH_INTERFACE(EventTarget)
77     // FIXME: Remove this once all event targets extend EventTarget
78     DOM_EVENT_TARGET_INTERFACES_FOR_EACH(TRY_TO_UNWRAP_WITH_INTERFACE)
79     return 0;
80 }
81
82 #undef TRY_TO_UNWRAP_WITH_INTERFACE
83
84 } // namespace WebCore