Home | History | Annotate | Download | only in custom
      1 /*
      2 * Copyright (C) 2009 Google 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 are
      6 * met:
      7 *
      8 *     * Redistributions of source code must retain the above copyright
      9 * notice, this list of conditions and the following disclaimer.
     10 *     * Redistributions in binary form must reproduce the above
     11 * copyright notice, this list of conditions and the following disclaimer
     12 * in the documentation and/or other materials provided with the
     13 * distribution.
     14 *     * Neither the name of Google Inc. nor the names of its
     15 * contributors may be used to endorse or promote products derived from
     16 * this software without specific prior written permission.
     17 *
     18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 */
     30 
     31 #include "config.h"
     32 #include "HTMLPlugInElement.h"
     33 
     34 #include "ScriptInstance.h"
     35 #include "V8Binding.h"
     36 #include "V8HTMLAppletElement.h"
     37 #include "V8HTMLEmbedElement.h"
     38 #include "V8HTMLObjectElement.h"
     39 #include "V8NPObject.h"
     40 #include "V8Proxy.h"
     41 
     42 namespace WebCore {
     43 
     44 // FIXME: Consider moving getter/setter helpers to V8NPObject and renaming this file to V8PluginElementFunctions
     45 // to match JSC bindings naming convention.
     46 
     47 template <class C>
     48 static v8::Handle<v8::Value> npObjectNamedGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
     49 {
     50     HTMLPlugInElement* imp = C::toNative(info.Holder());
     51     ScriptInstance scriptInstance = imp->getInstance();
     52     if (!scriptInstance)
     53         return notHandledByInterceptor();
     54 
     55     v8::Local<v8::Object> instance = v8::Local<v8::Object>::New(scriptInstance->instance());
     56     if (instance.IsEmpty())
     57         return notHandledByInterceptor();
     58 
     59     return npObjectGetNamedProperty(instance, name);
     60 }
     61 
     62 template <class C>
     63 static v8::Handle<v8::Value> npObjectNamedSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
     64 {
     65     HTMLPlugInElement* imp = C::toNative(info.Holder());
     66     ScriptInstance scriptInstance = imp->getInstance();
     67     if (!scriptInstance)
     68         return notHandledByInterceptor();
     69 
     70     v8::Local<v8::Object> instance = v8::Local<v8::Object>::New(scriptInstance->instance());
     71     if (instance.IsEmpty())
     72         return notHandledByInterceptor();
     73 
     74     return npObjectSetNamedProperty(instance, name, value);
     75 }
     76 
     77 v8::Handle<v8::Value> V8HTMLAppletElement::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
     78 {
     79     INC_STATS("DOM.HTMLAppletElement.NamedPropertyGetter");
     80     return npObjectNamedGetter<V8HTMLAppletElement>(name, info);
     81 }
     82 
     83 v8::Handle<v8::Value> V8HTMLEmbedElement::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
     84 {
     85     INC_STATS("DOM.HTMLEmbedElement.NamedPropertyGetter");
     86     return npObjectNamedGetter<V8HTMLEmbedElement>(name, info);
     87 }
     88 
     89 v8::Handle<v8::Value> V8HTMLObjectElement::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
     90 {
     91     INC_STATS("DOM.HTMLObjectElement.NamedPropertyGetter");
     92     return npObjectNamedGetter<V8HTMLObjectElement>(name, info);
     93 }
     94 
     95 v8::Handle<v8::Value> V8HTMLAppletElement::namedPropertySetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
     96 {
     97     INC_STATS("DOM.HTMLAppletElement.NamedPropertySetter");
     98     return npObjectNamedSetter<V8HTMLAppletElement>(name, value, info);
     99 }
    100 
    101 v8::Handle<v8::Value> V8HTMLEmbedElement::namedPropertySetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
    102 {
    103     INC_STATS("DOM.HTMLEmbedElement.NamedPropertySetter");
    104     return npObjectNamedSetter<V8HTMLEmbedElement>(name, value, info);
    105 }
    106 
    107 v8::Handle<v8::Value> V8HTMLObjectElement::namedPropertySetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
    108 {
    109     INC_STATS("DOM.HTMLObjectElement.NamedPropertySetter");
    110     return npObjectNamedSetter<V8HTMLObjectElement>(name, value, info);
    111 }
    112 
    113 v8::Handle<v8::Value> V8HTMLAppletElement::callAsFunctionCallback(const v8::Arguments& args)
    114 {
    115     INC_STATS("DOM.HTMLAppletElement()");
    116     return npObjectInvokeDefaultHandler(args);
    117 }
    118 
    119 v8::Handle<v8::Value> V8HTMLEmbedElement::callAsFunctionCallback(const v8::Arguments& args)
    120 {
    121     INC_STATS("DOM.HTMLEmbedElement()");
    122     return npObjectInvokeDefaultHandler(args);
    123 }
    124 
    125 v8::Handle<v8::Value> V8HTMLObjectElement::callAsFunctionCallback(const v8::Arguments& args)
    126 {
    127     INC_STATS("DOM.HTMLObjectElement()");
    128     return npObjectInvokeDefaultHandler(args);
    129 }
    130 
    131 template <class C>
    132 v8::Handle<v8::Value> npObjectIndexedGetter(uint32_t index, const v8::AccessorInfo& info)
    133 {
    134     INC_STATS("DOM.HTMLPlugInElement.IndexedPropertyGetter");
    135     HTMLPlugInElement* imp = C::toNative(info.Holder());
    136     ScriptInstance scriptInstance = imp->getInstance();
    137     if (!scriptInstance)
    138         return notHandledByInterceptor();
    139 
    140     v8::Local<v8::Object> instance = v8::Local<v8::Object>::New(scriptInstance->instance());
    141     if (instance.IsEmpty())
    142         return notHandledByInterceptor();
    143 
    144     return npObjectGetIndexedProperty(instance, index);
    145 }
    146 
    147 template <class C>
    148 v8::Handle<v8::Value> npObjectIndexedSetter(uint32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
    149 {
    150     INC_STATS("DOM.HTMLPlugInElement.IndexedPropertySetter");
    151     HTMLPlugInElement* imp = C::toNative(info.Holder());
    152     ScriptInstance scriptInstance = imp->getInstance();
    153     if (!scriptInstance)
    154         return notHandledByInterceptor();
    155 
    156     v8::Local<v8::Object> instance = v8::Local<v8::Object>::New(scriptInstance->instance());
    157     if (instance.IsEmpty())
    158         return notHandledByInterceptor();
    159 
    160     return npObjectSetIndexedProperty(instance, index, value);
    161 }
    162 
    163 v8::Handle<v8::Value> V8HTMLAppletElement::indexedPropertyGetter(uint32_t index, const v8::AccessorInfo& info)
    164 {
    165     INC_STATS("DOM.HTMLAppletElement.IndexedPropertyGetter");
    166     return npObjectIndexedGetter<V8HTMLAppletElement>(index, info);
    167 }
    168 
    169 v8::Handle<v8::Value> V8HTMLEmbedElement::indexedPropertyGetter(uint32_t index, const v8::AccessorInfo& info)
    170 {
    171     INC_STATS("DOM.HTMLEmbedElement.IndexedPropertyGetter");
    172     return npObjectIndexedGetter<V8HTMLEmbedElement>(index, info);
    173 }
    174 
    175 v8::Handle<v8::Value> V8HTMLObjectElement::indexedPropertyGetter(uint32_t index, const v8::AccessorInfo& info)
    176 {
    177     INC_STATS("DOM.HTMLObjectElement.IndexedPropertyGetter");
    178     return npObjectIndexedGetter<V8HTMLObjectElement>(index, info);
    179 }
    180 
    181 v8::Handle<v8::Value> V8HTMLAppletElement::indexedPropertySetter(uint32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
    182 {
    183     INC_STATS("DOM.HTMLAppletElement.IndexedPropertySetter");
    184     return npObjectIndexedSetter<V8HTMLAppletElement>(index, value, info);
    185 }
    186 
    187 v8::Handle<v8::Value> V8HTMLEmbedElement::indexedPropertySetter(uint32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
    188 {
    189     INC_STATS("DOM.HTMLEmbedElement.IndexedPropertySetter");
    190     return npObjectIndexedSetter<V8HTMLEmbedElement>(index, value, info);
    191 }
    192 
    193 v8::Handle<v8::Value> V8HTMLObjectElement::indexedPropertySetter(uint32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
    194 {
    195     INC_STATS("DOM.HTMLObjectElement.IndexedPropertySetter");
    196     return npObjectIndexedSetter<V8HTMLObjectElement>(index, value, info);
    197 }
    198 
    199 } // namespace WebCore
    200