v8::Local<v8::Object> V8DOMWrapper::instantiateV8Object(V8Proxy* proxy, WrapperTypeInfo* type, void* impl) { #if ENABLE(WORKERS) WorkerContext* workerContext = 0; #endif V8BindingPerContextData* contextData = 0; V8IsolatedContext* isolatedContext; if (UNLIKELY(!!(isolatedContext = V8IsolatedContext::getEntered()))) { contextData = isolatedContext->perContextData(); } else if (!proxy) { v8::Handle<v8::Context> context = v8::Context::GetCurrent(); if (!context.IsEmpty()) { v8::Handle<v8::Object> globalPrototype = v8::Handle<v8::Object>::Cast(context->Global()->GetPrototype()); if (isWrapperOfType(globalPrototype, &V8DOMWindow::info)) { Frame* frame = V8DOMWindow::toNative(globalPrototype)->frame(); if (frame && frame->script()->canExecuteScripts(NotAboutToExecuteScript)) proxy = V8Proxy::retrieve(frame); } #if ENABLE(WORKERS) else if (isWrapperOfType(globalPrototype, &V8WorkerContext::info)) workerContext = V8WorkerContext::toNative(lookupDOMWrapper(V8WorkerContext::GetTemplate(), context->Global())); #endif } } v8::Local<v8::Object> instance; if (!contextData) { if (proxy) contextData = perContextData(proxy); #if ENABLE(WORKERS) else if (workerContext) contextData = perContextData(workerContext); #endif } if (contextData) instance = contextData->createWrapperFromCache(type); else { v8::Local<v8::Function> function = type->getTemplate()->GetFunction(); instance = SafeAllocation::newInstance(function); } if (!instance.IsEmpty()) { // Avoid setting the DOM wrapper for failed allocations. setDOMWrapper(instance, type, impl); if (type == &V8HTMLDocument::info) instance = V8HTMLDocument::WrapInShadowObject(instance, static_cast<Node*>(impl)); } return instance; }
v8::Local<v8::Object> V8DOMWrapper::instantiateV8Object(V8Proxy* proxy, WrapperTypeInfo* type, void* impl) { #if ENABLE(WORKERS) WorkerContext* workerContext = 0; #endif if (V8IsolatedContext::getEntered()) { // This effectively disables the wrapper cache for isolated worlds. proxy = 0; // FIXME: Do we need a wrapper cache for the isolated world? We should // see if the performance gains are worth while. // We'll get one once we give the isolated context a proper window shell. } else if (!proxy) { v8::Handle<v8::Context> context = v8::Context::GetCurrent(); if (!context.IsEmpty()) { v8::Handle<v8::Object> globalPrototype = v8::Handle<v8::Object>::Cast(context->Global()->GetPrototype()); if (isWrapperOfType(globalPrototype, &V8DOMWindow::info)) { Frame* frame = V8DOMWindow::toNative(globalPrototype)->frame(); if (frame && frame->script()->canExecuteScripts(NotAboutToExecuteScript)) proxy = V8Proxy::retrieve(frame); } #if ENABLE(WORKERS) else workerContext = V8WorkerContext::toNative(lookupDOMWrapper(V8WorkerContext::GetTemplate(), context->Global())); #endif } } v8::Local<v8::Object> instance; if (proxy) // FIXME: Fix this to work properly with isolated worlds (see above). instance = proxy->windowShell()->createWrapperFromCache(type); else { v8::Local<v8::Function> function; #if ENABLE(WORKERS) if (workerContext) function = getConstructor(type, workerContext); else #endif function = type->getTemplate()->GetFunction(); instance = SafeAllocation::newInstance(function); } if (!instance.IsEmpty()) { // Avoid setting the DOM wrapper for failed allocations. setDOMWrapper(instance, type, impl); if (type == &V8HTMLDocument::info) instance = V8HTMLDocument::WrapInShadowObject(instance, static_cast<Node*>(impl)); } return instance; }
PassRefPtr<EventListener> V8DOMWrapper::getEventListener(v8::Local<v8::Value> value, bool isAttribute, ListenerLookupType lookup) { v8::Handle<v8::Context> context = v8::Context::GetCurrent(); if (context.IsEmpty()) return 0; if (lookup == ListenerFindOnly) return V8EventListenerList::findWrapper(value, isAttribute); if (isWrapperOfType(toInnerGlobalObject(context), &V8DOMWindow::info)) return V8EventListenerList::findOrCreateWrapper<V8EventListener>(value, isAttribute); #if ENABLE(WORKERS) return V8EventListenerList::findOrCreateWrapper<V8WorkerContextEventListener>(value, isAttribute); #else return 0; #endif }