v8::Local<v8::Object> V8DOMWrapper::createWrapper(v8::Isolate* isolate, v8::Local<v8::Object> creationContext, const WrapperTypeInfo* type, ScriptWrappable* scriptWrappable) { ASSERT(!type->equals(&V8Window::wrapperTypeInfo)); // According to https://html.spec.whatwg.org/multipage/browsers.html#security-location, // cross-origin script access to a few properties of Location is allowed. // Location already implements the necessary security checks. bool withSecurityCheck = !type->equals(&V8Location::wrapperTypeInfo); V8WrapperInstantiationScope scope(creationContext, isolate, withSecurityCheck); V8PerContextData* perContextData = V8PerContextData::from(scope.context()); v8::Local<v8::Object> wrapper; if (perContextData) { wrapper = perContextData->createWrapperFromCache(type); } else { v8::Local<v8::Function> function; if (!type->domTemplate(isolate)->GetFunction(isolate->GetCurrentContext()).ToLocal(&function)) return v8::Local<v8::Object>(); if (!V8ObjectConstructor::newInstance(isolate, function).ToLocal(&wrapper)) return v8::Local<v8::Object>(); } if (type == &V8HTMLDocument::wrapperTypeInfo && !wrapper.IsEmpty()) wrapper = wrapInShadowTemplate(wrapper, scriptWrappable, isolate); return wrapper; }
v8::Local<v8::Object> V8DOMWrapper::instantiateV8Object(Document* deprecatedDocument, WrapperTypeInfo* type, void* impl) { V8PerContextData* perContextData = 0; // Please don't add any more uses of deprecatedDocument. We want to remove it. // If we have a pointer to the frame, we cna get the V8PerContextData // directly, which is faster than going through V8. if (deprecatedDocument && deprecatedDocument->frame()) perContextData = perContextDataForCurrentWorld(deprecatedDocument->frame()); else perContextData = V8PerContextData::from(v8::Context::GetCurrent()); v8::Local<v8::Object> instance = perContextData ? perContextData->createWrapperFromCache(type) : V8ObjectConstructor::newInstance(type->getTemplate()->GetFunction()); // Avoid setting the DOM wrapper for failed allocations. if (instance.IsEmpty()) return instance; setDOMWrapper(instance, type, impl); if (type == &V8HTMLDocument::info) instance = V8HTMLDocument::wrapInShadowObject(instance, static_cast<Node*>(impl)); return instance; }
v8::Local<v8::Object> V8DOMWrapper::createWrapper(v8::Handle<v8::Object> creationContext, WrapperTypeInfo* type, void* impl, v8::Isolate* isolate) { V8WrapperInstantiationScope scope(creationContext); V8PerContextData* perContextData = V8PerContextData::from(scope.context()); v8::Local<v8::Object> wrapper = perContextData ? perContextData->createWrapperFromCache(type) : V8ObjectConstructor::newInstance(type->getTemplate(isolate, worldTypeInMainThread(isolate))->GetFunction()); if (type == &V8HTMLDocument::info && !wrapper.IsEmpty()) wrapper = wrapInShadowTemplate(wrapper, static_cast<Node*>(impl), isolate); return wrapper; }
v8::Local<v8::Object> V8DOMWrapper::instantiateV8Object(v8::Handle<v8::Object> creationContext, WrapperTypeInfo* type, void* impl) { V8WrapperInstantiationScope scope(creationContext); V8PerContextData* perContextData = V8PerContextData::from(scope.context()); v8::Local<v8::Object> instance = perContextData ? perContextData->createWrapperFromCache(type) : V8ObjectConstructor::newInstance(type->getTemplate()->GetFunction()); // Avoid setting the DOM wrapper for failed allocations. if (instance.IsEmpty()) return instance; if (type == &V8HTMLDocument::info) instance = V8HTMLDocument::wrapInShadowObject(instance, static_cast<Node*>(impl)); return instance; }
v8::Local<v8::Object> V8DOMWrapper::createWrapper(v8::Isolate* isolate, v8::Local<v8::Object> creationContext, const WrapperTypeInfo* type, ScriptWrappable* scriptWrappable) { V8WrapperInstantiationScope scope(creationContext, isolate); V8PerContextData* perContextData = V8PerContextData::from(scope.context()); v8::Local<v8::Object> wrapper; if (perContextData) { wrapper = perContextData->createWrapperFromCache(type); } else { v8::Local<v8::Function> function; if (!type->domTemplate(isolate)->GetFunction(isolate->GetCurrentContext()).ToLocal(&function)) return v8::Local<v8::Object>(); if (!V8ObjectConstructor::newInstance(isolate, function).ToLocal(&wrapper)) return v8::Local<v8::Object>(); } if (type == &V8HTMLDocument::wrapperTypeInfo && !wrapper.IsEmpty()) wrapper = wrapInShadowTemplate(wrapper, scriptWrappable, isolate); return wrapper; }