V8BindingPerContextData* V8Proxy::retrievePerContextData(Frame* frame) { V8IsolatedContext* isolatedContext; if (UNLIKELY(!!(isolatedContext = V8IsolatedContext::getEntered()))) return isolatedContext->perContextData(); return frame->script()->windowShell()->perContextData(); }
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; }