Changeset 140615 in webkit


Ignore:
Timestamp:
Jan 23, 2013 4:43:14 PM (11 years ago)
Author:
haraken@chromium.org
Message:

[V8] Move V8DOMWrapper::getEventListener() to V8EventListerList
https://bugs.webkit.org/show_bug.cgi?id=107683

Reviewed by Adam Barth.

No tests. No change in behavior.

  • bindings/scripts/CodeGeneratorV8.pm:

(GenerateNormalAttrSetter):
(GenerateEventListenerCallback):

  • bindings/scripts/test/V8/V8TestEventTarget.cpp:

(WebCore::TestEventTargetV8Internal::addEventListenerCallback):
(WebCore::TestEventTargetV8Internal::removeEventListenerCallback):

  • bindings/scripts/test/V8/V8TestObj.cpp:

(WebCore::TestObjV8Internal::addEventListenerCallback):
(WebCore::TestObjV8Internal::removeEventListenerCallback):

  • bindings/v8/V8DOMWrapper.cpp:
  • bindings/v8/V8DOMWrapper.h:

(V8DOMWrapper):

  • bindings/v8/V8EventListenerList.cpp:

(WebCore::V8EventListenerList::getEventListener):
(WebCore):

  • bindings/v8/V8EventListenerList.h:

(WebCore):
(V8EventListenerList):
(WebCore::V8EventListenerList::findWrapper):
(WebCore::V8EventListenerList::clearWrapper):
(WebCore::V8EventListenerList::doFindWrapper):
(WebCore::V8EventListenerList::getHiddenProperty):
(WebCore::V8EventListenerList::findOrCreateWrapper):

  • bindings/v8/custom/V8DOMWindowCustom.cpp:

(WebCore::V8DOMWindow::addEventListenerCallback):
(WebCore::V8DOMWindow::removeEventListenerCallback):

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r140614 r140615  
     12013-01-23  Kentaro Hara  <haraken@chromium.org>
     2
     3        [V8] Move V8DOMWrapper::getEventListener() to V8EventListerList
     4        https://bugs.webkit.org/show_bug.cgi?id=107683
     5
     6        Reviewed by Adam Barth.
     7
     8        No tests. No change in behavior.
     9
     10        * bindings/scripts/CodeGeneratorV8.pm:
     11        (GenerateNormalAttrSetter):
     12        (GenerateEventListenerCallback):
     13        * bindings/scripts/test/V8/V8TestEventTarget.cpp:
     14        (WebCore::TestEventTargetV8Internal::addEventListenerCallback):
     15        (WebCore::TestEventTargetV8Internal::removeEventListenerCallback):
     16        * bindings/scripts/test/V8/V8TestObj.cpp:
     17        (WebCore::TestObjV8Internal::addEventListenerCallback):
     18        (WebCore::TestObjV8Internal::removeEventListenerCallback):
     19        * bindings/v8/V8DOMWrapper.cpp:
     20        * bindings/v8/V8DOMWrapper.h:
     21        (V8DOMWrapper):
     22        * bindings/v8/V8EventListenerList.cpp:
     23        (WebCore::V8EventListenerList::getEventListener):
     24        (WebCore):
     25        * bindings/v8/V8EventListenerList.h:
     26        (WebCore):
     27        (V8EventListenerList):
     28        (WebCore::V8EventListenerList::findWrapper):
     29        (WebCore::V8EventListenerList::clearWrapper):
     30        (WebCore::V8EventListenerList::doFindWrapper):
     31        (WebCore::V8EventListenerList::getHiddenProperty):
     32        (WebCore::V8EventListenerList::findOrCreateWrapper):
     33        * bindings/v8/custom/V8DOMWindowCustom.cpp:
     34        (WebCore::V8DOMWindow::addEventListenerCallback):
     35        (WebCore::V8DOMWindow::removeEventListenerCallback):
     36
    1372013-01-23  Dominic Mazzoni  <dmazzoni@google.com>
    238
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm

    r140514 r140615  
    12651265                push(@implContentDecls, "    transferHiddenDependency(info.Holder(), imp->$attrName(), value, ${v8InterfaceName}::eventListenerCacheIndex);\n");
    12661266            }
     1267            AddToImplIncludes("V8EventListenerList.h");
    12671268            if ($interfaceName eq "WorkerContext" and $attribute->signature->name eq "onerror") {
    1268                 AddToImplIncludes("V8EventListenerList.h");
    12691269                AddToImplIncludes("V8WorkerContextErrorHandler.h");
    12701270                push(@implContentDecls, "    imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8WorkerContextErrorHandler>(value, true)");
    12711271            } elsif ($interfaceName eq "DOMWindow" and $attribute->signature->name eq "onerror") {
    1272                 AddToImplIncludes("V8EventListenerList.h");
    12731272                AddToImplIncludes("V8WindowErrorHandler.h");
    12741273                push(@implContentDecls, "    imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8WindowErrorHandler>(value, true)");
    12751274            } else {
    1276                 push(@implContentDecls, "    imp->set$implSetterFunctionName(V8DOMWrapper::getEventListener(value, true, ListenerFindOrCreate)");
     1275                push(@implContentDecls, "    imp->set$implSetterFunctionName(V8EventListenerList::getEventListener(value, true, ListenerFindOrCreate)");
    12771276            }
    12781277            push(@implContentDecls, ", ec") if $useExceptions;
     
    13541353    my $passRefPtrHandling = ($functionName eq "add") ? "" : ".get()";
    13551354    my $hiddenDependencyAction = ($functionName eq "add") ? "create" : "remove";
    1356  
     1355
     1356    AddToImplIncludes("V8EventListenerList.h");
    13571357    push(@implContentDecls, <<END);
    13581358static v8::Handle<v8::Value> ${functionName}EventListenerCallback(const v8::Arguments& args)
    13591359{
    1360     RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFind${lookupType});
     1360    RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFind${lookupType});
    13611361    if (listener) {
    13621362        V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
  • trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp

    r138665 r140615  
    3131#include "V8DOMWrapper.h"
    3232#include "V8Event.h"
     33#include "V8EventListenerList.h"
    3334#include "V8Node.h"
    3435#include <wtf/UnusedParam.h>
     
    6263static v8::Handle<v8::Value> addEventListenerCallback(const v8::Arguments& args)
    6364{
    64     RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);
     65    RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate);
    6566    if (listener) {
    6667        V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
     
    7374static v8::Handle<v8::Value> removeEventListenerCallback(const v8::Arguments& args)
    7475{
    75     RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);
     76    RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly);
    7677    if (listener) {
    7778        V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
  • trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp

    r140514 r140615  
    4242#include "V8DOMWrapper.h"
    4343#include "V8Document.h"
     44#include "V8EventListenerList.h"
    4445#include "V8Float32Array.h"
    4546#include "V8Node.h"
     
    10701071static v8::Handle<v8::Value> addEventListenerCallback(const v8::Arguments& args)
    10711072{
    1072     RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);
     1073    RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate);
    10731074    if (listener) {
    10741075        V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
     
    10811082static v8::Handle<v8::Value> removeEventListenerCallback(const v8::Arguments& args)
    10821083{
    1083     RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);
     1084    RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly);
    10841085    if (listener) {
    10851086        V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
  • trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp

    r138682 r140615  
    3434#include "V8Binding.h"
    3535#include "V8DOMWindow.h"
    36 #include "V8EventListenerList.h"
    3736#include "V8HTMLCollection.h"
    3837#include "V8HTMLDocument.h"
     
    4039#include "V8ObjectConstructor.h"
    4140#include "V8PerContextData.h"
    42 #include "V8WorkerContextEventListener.h"
    4341
    4442namespace WebCore {
     
    131129}
    132130
    133 PassRefPtr<EventListener> V8DOMWrapper::getEventListener(v8::Local<v8::Value> value, bool isAttribute, ListenerLookupType lookup)
    134 {
    135     v8::Handle<v8::Context> context = v8::Context::GetCurrent();
    136     if (context.IsEmpty())
    137         return 0;
    138     if (lookup == ListenerFindOnly)
    139         return V8EventListenerList::findWrapper(value, isAttribute);
    140     if (isWrapperOfType(toInnerGlobalObject(context), &V8DOMWindow::info))
    141         return V8EventListenerList::findOrCreateWrapper<V8EventListener>(value, isAttribute);
    142 #if ENABLE(WORKERS)
    143     return V8EventListenerList::findOrCreateWrapper<V8WorkerContextEventListener>(value, isAttribute);
    144 #else
    145     return 0;
    146 #endif
    147 }
    148 
    149131}  // namespace WebCore
  • trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h

    r140302 r140615  
    4747namespace WebCore {
    4848
    49     enum ListenerLookupType {
    50         ListenerFindOnly,
    51         ListenerFindOrCreate,
    52     };
    53 
    5449    class V8DOMWrapper {
    5550    public:
     
    6762        static inline void setWrapperClass(void*, v8::Persistent<v8::Object>);
    6863        static inline void setWrapperClass(Node*, v8::Persistent<v8::Object>);
    69 
    70         // FIXME: This function should probably move to V8EventListenerList.h
    71         static PassRefPtr<EventListener> getEventListener(v8::Local<v8::Value>, bool isAttribute, ListenerLookupType);
    7264
    7365        static bool isWrapperOfType(v8::Handle<v8::Value>, WrapperTypeInfo*);
  • trunk/Source/WebCore/bindings/v8/V8EventListenerList.cpp

    r95901 r140615  
    3232#include "V8EventListenerList.h"
    3333
     34#include "V8Binding.h"
     35#include "V8DOMWindow.h"
     36#include "V8WorkerContextEventListener.h"
     37
    3438namespace WebCore {
    3539
     40PassRefPtr<EventListener> V8EventListenerList::getEventListener(v8::Local<v8::Value> value, bool isAttribute, ListenerLookupType lookup)
     41{
     42    v8::Handle<v8::Context> context = v8::Context::GetCurrent();
     43    if (context.IsEmpty())
     44        return 0;
     45    if (lookup == ListenerFindOnly)
     46        return V8EventListenerList::findWrapper(value, isAttribute);
     47    if (V8DOMWrapper::isWrapperOfType(toInnerGlobalObject(context), &V8DOMWindow::info))
     48        return V8EventListenerList::findOrCreateWrapper<V8EventListener>(value, isAttribute);
     49#if ENABLE(WORKERS)
     50    return V8EventListenerList::findOrCreateWrapper<V8WorkerContextEventListener>(value, isAttribute);
     51#else
     52    return 0;
     53#endif
     54}
     55
    3656} // namespace WebCore
  • trunk/Source/WebCore/bindings/v8/V8EventListenerList.h

    r134811 r140615  
    3939
    4040namespace WebCore {
    41     class Frame;
    4241
    43     // This is a container for V8EventListener objects that uses hidden properties of v8::Object to speed up lookups.
    44     class V8EventListenerList {
    45     public:
    46         static PassRefPtr<V8EventListener> findWrapper(v8::Local<v8::Value> value, bool isAttribute)
    47         {
    48             ASSERT(v8::Context::InContext());
    49             if (!value->IsObject())
    50                 return 0;
     42class Frame;
    5143
    52             v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
    53             return doFindWrapper(v8::Local<v8::Object>::Cast(value), wrapperProperty);
    54         }
     44enum ListenerLookupType {
     45    ListenerFindOnly,
     46    ListenerFindOrCreate,
     47};
    5548
    56         template<typename WrapperType>
    57         static PassRefPtr<V8EventListener> findOrCreateWrapper(v8::Local<v8::Value>, bool isAttribute);
    58 
    59         static void clearWrapper(v8::Handle<v8::Object> listenerObject, bool isAttribute)
    60         {
    61             v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
    62             listenerObject->DeleteHiddenValue(wrapperProperty);
    63         }
    64 
    65     private:
    66         static V8EventListener* doFindWrapper(v8::Local<v8::Object> object, v8::Handle<v8::String> wrapperProperty)
    67         {
    68             ASSERT(v8::Context::InContext());
    69             v8::HandleScope scope;
    70             v8::Local<v8::Value> listener = object->GetHiddenValue(wrapperProperty);
    71             if (listener.IsEmpty())
    72                 return 0;
    73             return static_cast<V8EventListener*>(v8::External::Cast(*listener)->Value());
    74         }
    75 
    76         static inline v8::Handle<v8::String> getHiddenProperty(bool isAttribute)
    77         {
    78             return isAttribute ? V8HiddenPropertyName::attributeListener() : V8HiddenPropertyName::listener();
    79         }
    80     };
    81 
    82     template<typename WrapperType>
    83     PassRefPtr<V8EventListener> V8EventListenerList::findOrCreateWrapper(v8::Local<v8::Value> value, bool isAttribute)
     49// This is a container for V8EventListener objects that uses hidden properties of v8::Object to speed up lookups.
     50class V8EventListenerList {
     51public:
     52    static PassRefPtr<V8EventListener> findWrapper(v8::Local<v8::Value> value, bool isAttribute)
    8453    {
    8554        ASSERT(v8::Context::InContext());
     
    8756            return 0;
    8857
    89         v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value);
    9058        v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
     59        return doFindWrapper(v8::Local<v8::Object>::Cast(value), wrapperProperty);
     60    }
    9161
    92         V8EventListener* wrapper = doFindWrapper(object, wrapperProperty);
    93         if (wrapper)
    94             return wrapper;
     62    template<typename WrapperType>
     63    static PassRefPtr<V8EventListener> findOrCreateWrapper(v8::Local<v8::Value>, bool isAttribute);
    9564
    96         PassRefPtr<V8EventListener> wrapperPtr = WrapperType::create(object, isAttribute, WorldContextHandle(UseCurrentWorld));
    97         if (wrapperPtr)
    98             object->SetHiddenValue(wrapperProperty, v8::External::New(wrapperPtr.get()));
     65    static void clearWrapper(v8::Handle<v8::Object> listenerObject, bool isAttribute)
     66    {
     67        v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
     68        listenerObject->DeleteHiddenValue(wrapperProperty);
     69    }
    9970
    100         return wrapperPtr;
     71    static PassRefPtr<EventListener> getEventListener(v8::Local<v8::Value>, bool isAttribute, ListenerLookupType);
     72
     73private:
     74    static V8EventListener* doFindWrapper(v8::Local<v8::Object> object, v8::Handle<v8::String> wrapperProperty)
     75    {
     76        ASSERT(v8::Context::InContext());
     77        v8::HandleScope scope;
     78        v8::Local<v8::Value> listener = object->GetHiddenValue(wrapperProperty);
     79        if (listener.IsEmpty())
     80            return 0;
     81        return static_cast<V8EventListener*>(v8::External::Cast(*listener)->Value());
    10182    }
     83
     84    static inline v8::Handle<v8::String> getHiddenProperty(bool isAttribute)
     85    {
     86        return isAttribute ? V8HiddenPropertyName::attributeListener() : V8HiddenPropertyName::listener();
     87    }
     88};
     89
     90template<typename WrapperType>
     91PassRefPtr<V8EventListener> V8EventListenerList::findOrCreateWrapper(v8::Local<v8::Value> value, bool isAttribute)
     92{
     93    ASSERT(v8::Context::InContext());
     94    if (!value->IsObject())
     95        return 0;
     96
     97    v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value);
     98    v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
     99
     100    V8EventListener* wrapper = doFindWrapper(object, wrapperProperty);
     101    if (wrapper)
     102        return wrapper;
     103
     104    RefPtr<V8EventListener> wrapperPtr = WrapperType::create(object, isAttribute, WorldContextHandle(UseCurrentWorld));
     105    if (wrapperPtr)
     106        object->SetHiddenValue(wrapperProperty, v8::External::New(wrapperPtr.get()));
     107
     108    return wrapperPtr;
     109}
    102110
    103111} // namespace WebCore
  • trunk/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp

    r138677 r140615  
    5757#include "V8Binding.h"
    5858#include "V8EventListener.h"
     59#include "V8EventListenerList.h"
    5960#include "V8GCForContextDispose.h"
    6061#include "V8HiddenPropertyName.h"
     
    245246        return v8::Undefined();
    246247
    247     RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);
     248    RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate);
    248249
    249250    if (listener) {
     
    274275        return v8::Undefined();
    275276
    276     RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);
     277    RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly);
    277278
    278279    if (listener) {
Note: See TracChangeset for help on using the changeset viewer.