Changeset 49248 in webkit


Ignore:
Timestamp:
Oct 7, 2009 9:59:07 AM (14 years ago)
Author:
eric@webkit.org
Message:

2009-10-07 Anton Muhin <antonm@chromium.org>

Reviewed by Adam Barth.

Fetch pointers to C++ DOM window immediately from holder
object (do not search prototype chain for proper JS wrapper).
https://bugs.webkit.org/show_bug.cgi?id=29031

  • bindings/scripts/CodeGeneratorV8.pm:
  • bindings/v8/V8DOMWrapper.cpp: (WebCore::V8DOMWrapper::getTemplate):
  • bindings/v8/V8Proxy.cpp: (WebCore::V8Proxy::createNewContext): (WebCore::V8Proxy::installDOMWindow):
  • bindings/v8/custom/V8DOMWindowCustom.cpp: (WebCore::ACCESSOR_GETTER): (WebCore::ACCESSOR_SETTER): (WebCore::INDEXED_PROPERTY_GETTER): (WebCore::NAMED_PROPERTY_GETTER): (WebCore::NAMED_ACCESS_CHECK):
Location:
trunk/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r49244 r49248  
     12009-10-07  Anton Muhin  <antonm@chromium.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        Fetch pointers to C++ DOM window immediately from holder
     6        object (do not search prototype chain for proper JS wrapper).
     7        https://bugs.webkit.org/show_bug.cgi?id=29031
     8
     9        * bindings/scripts/CodeGeneratorV8.pm:
     10        * bindings/v8/V8DOMWrapper.cpp:
     11        (WebCore::V8DOMWrapper::getTemplate):
     12        * bindings/v8/V8Proxy.cpp:
     13        (WebCore::V8Proxy::createNewContext):
     14        (WebCore::V8Proxy::installDOMWindow):
     15        * bindings/v8/custom/V8DOMWindowCustom.cpp:
     16        (WebCore::ACCESSOR_GETTER):
     17        (WebCore::ACCESSOR_SETTER):
     18        (WebCore::INDEXED_PROPERTY_GETTER):
     19        (WebCore::NAMED_PROPERTY_GETTER):
     20        (WebCore::NAMED_ACCESS_CHECK):
     21        (WebCore::INDEXED_ACCESS_CHECK):
    1222009-10-07  Adam Roben  <aroben@apple.com>
    223
  • trunk/WebCore/bindings/scripts/CodeGeneratorV8.pm

    r49221 r49248  
    517517
    518518    } elsif ($attrExt->{"v8OnProto"} || $attrExt->{"V8DisallowShadowing"}) {
     519      if ($classIndex eq "DOMWINDOW") {
     520        push(@implContentDecls, <<END);
     521    v8::Handle<v8::Object> holder = info.Holder();
     522END
     523      } else {
    519524        # perform lookup first
    520525        push(@implContentDecls, <<END);
     
    522527    if (holder.IsEmpty()) return v8::Undefined();
    523528END
     529      }
    524530        HolderToNative($dataNode, $implClassName, $classIndex);
    525531    } else {
     
    693699
    694700    } elsif ($attrExt->{"v8OnProto"}) {
     701      if ($classIndex eq "DOMWINDOW") {
     702        push(@implContentDecls, <<END);
     703    v8::Handle<v8::Object> holder = info.Holder();
     704END
     705      } else {
    695706        # perform lookup first
    696707        push(@implContentDecls, <<END);
     
    698709    if (holder.IsEmpty()) return;
    699710END
     711      }
    700712        HolderToNative($dataNode, $implClassName, $classIndex);
    701713    } else {
  • trunk/WebCore/bindings/v8/V8DOMWrapper.cpp

    r49050 r49248  
    342342        descriptor->PrototypeTemplate()->SetNamedPropertyHandler(USE_NAMED_PROPERTY_GETTER(DOMWindow));
    343343        descriptor->PrototypeTemplate()->SetIndexedPropertyHandler(USE_INDEXED_PROPERTY_GETTER(DOMWindow));
     344        descriptor->PrototypeTemplate()->SetInternalFieldCount(V8Custom::kDOMWindowInternalFieldCount);
    344345
    345346        descriptor->SetHiddenPrototype(true);
  • trunk/WebCore/bindings/v8/V8Proxy.cpp

    r49050 r49248  
    913913    // Install a security handler with V8.
    914914    globalTemplate->SetAccessCheckCallbacks(V8Custom::v8DOMWindowNamedSecurityCheck, V8Custom::v8DOMWindowIndexedSecurityCheck, v8::Integer::New(V8ClassIndex::DOMWINDOW));
     915    globalTemplate->SetInternalFieldCount(V8Custom::kDOMWindowInternalFieldCount);
    915916
    916917    // Used to avoid sleep calls in unload handlers.
     
    954955    // Wrap the window.
    955956    V8DOMWrapper::setDOMWrapper(jsWindow, V8ClassIndex::ToInt(V8ClassIndex::DOMWINDOW), window);
     957    V8DOMWrapper::setDOMWrapper(v8::Handle<v8::Object>::Cast(jsWindow->GetPrototype()), V8ClassIndex::ToInt(V8ClassIndex::DOMWINDOW), window);
    956958
    957959    window->ref();
     
    960962    // Insert the window instance as the prototype of the shadow object.
    961963    v8::Handle<v8::Object> v8Global = context->Global();
     964    V8DOMWrapper::setDOMWrapper(v8::Handle<v8::Object>::Cast(v8Global->GetPrototype()), V8ClassIndex::ToInt(V8ClassIndex::DOMWINDOW), window);
    962965    v8Global->Set(implicitProtoString, jsWindow);
    963966    return true;
  • trunk/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp

    r49219 r49248  
    199199ACCESSOR_SETTER(DOMWindowLocation)
    200200{
    201     v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8ClassIndex::DOMWINDOW, info.This());
    202     if (holder.IsEmpty())
    203         return;
    204 
    205     DOMWindow* imp = V8DOMWrapper::convertToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, holder);
     201    DOMWindow* imp = V8DOMWrapper::convertToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, info.Holder());
    206202    WindowSetLocation(imp, toWebCoreString(value));
    207203}
     
    744740{
    745741    INC_STATS("DOM.DOMWindow.IndexedPropertyGetter");
    746     v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8ClassIndex::DOMWINDOW, info.This());
    747     if (holder.IsEmpty())
    748         return notHandledByInterceptor();
    749 
    750     DOMWindow* window = V8DOMWrapper::convertToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, holder);
     742
     743    DOMWindow* window = V8DOMWrapper::convertToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, info.Holder());
    751744    if (!window)
    752745        return notHandledByInterceptor();
     
    768761    INC_STATS("DOM.DOMWindow.NamedPropertyGetter");
    769762
    770     v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8ClassIndex::DOMWINDOW, info.This());
    771     if (holder.IsEmpty())
    772         return notHandledByInterceptor();
    773 
    774     DOMWindow* window = V8DOMWrapper::convertToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, holder);
     763    // TODO(antonm): investigate what convertToNativeObject does for the case of DOMWINDOW.
     764    DOMWindow* window = V8DOMWrapper::convertToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, info.Holder());
    775765    if (!window)
    776766        return notHandledByInterceptor();
     
    788778
    789779    // Search IDL functions defined in the prototype
    790     v8::Handle<v8::Value> result = holder->GetRealNamedPropertyInPrototypeChain(name);
     780    v8::Handle<v8::Value> result = info.Holder()->GetRealNamedProperty(name);
    791781    if (!result.IsEmpty())
    792782        return result;
Note: See TracChangeset for help on using the changeset viewer.