void WindowProxy::createContext() { // Create a new environment using an empty template for the shadow // object. Reuse the global object if one has been created earlier. v8::Handle<v8::ObjectTemplate> globalTemplate = V8Window::getShadowObjectTemplate(m_isolate); if (globalTemplate.IsEmpty()) return; double contextCreationStartInSeconds = currentTime(); // Dynamically tell v8 about our extensions now. const V8Extensions& extensions = ScriptController::registeredExtensions(); OwnPtr<const char*[]> extensionNames = adoptArrayPtr(new const char*[extensions.size()]); int index = 0; for (size_t i = 0; i < extensions.size(); ++i) { extensionNames[index++] = extensions[i]->name(); } v8::ExtensionConfiguration extensionConfiguration(index, extensionNames.get()); v8::Handle<v8::Context> context = v8::Context::New(m_isolate, &extensionConfiguration, globalTemplate, m_global.newLocal(m_isolate)); if (context.IsEmpty()) return; m_scriptState = ScriptState::create(context, m_world); double contextCreationDurationInMilliseconds = (currentTime() - contextCreationStartInSeconds) * 1000; const char* histogramName = "WebCore.WindowProxy.createContext.MainWorld"; if (!m_world->isMainWorld()) histogramName = "WebCore.WindowProxy.createContext.IsolatedWorld"; blink::Platform::current()->histogramCustomCounts(histogramName, contextCreationDurationInMilliseconds, 0, 10000, 50); }
void WindowProxy::createContext() { // FIXME: This should be a null check of m_frame->client(), but there are // still some edge cases // that this fails to catch during frame detach. if (m_frame->isLocalFrame() && !toLocalFrame(m_frame)->loader().documentLoader()) return; // Create a new v8::Context with the window object as the global object // (aka the inner global). Reuse the global proxy object (aka the outer // global) if it already exists. See the comments in // setupWindowPrototypeChain for the structure of the prototype chain of // the global object. v8::Local<v8::ObjectTemplate> globalTemplate = V8Window::domTemplate(m_isolate, *m_world)->InstanceTemplate(); if (globalTemplate.IsEmpty()) return; // FIXME: It's not clear what the right thing to do for remote frames is. // The extensions registered don't generally seem to make sense for remote // frames, so skip it for now. Vector<const char*> extensionNames; if (m_frame->isLocalFrame()) { LocalFrame* frame = toLocalFrame(m_frame); // Dynamically tell v8 about our extensions now. const V8Extensions& extensions = ScriptController::registeredExtensions(); extensionNames.reserveInitialCapacity(extensions.size()); int extensionGroup = m_world->extensionGroup(); int worldId = m_world->worldId(); for (const auto* extension : extensions) { if (!frame->loader().client()->allowScriptExtension( extension->name(), extensionGroup, worldId)) continue; extensionNames.append(extension->name()); } } v8::ExtensionConfiguration extensionConfiguration(extensionNames.size(), extensionNames.data()); v8::Local<v8::Context> context; { V8PerIsolateData::UseCounterDisabledScope useCounterDisabled( V8PerIsolateData::from(m_isolate)); context = v8::Context::New(m_isolate, &extensionConfiguration, globalTemplate, m_global.newLocal(m_isolate)); } if (context.IsEmpty()) return; m_scriptState = ScriptState::create(context, m_world); }
void WindowProxy::createContext() { // FIXME: This should be a null check of m_frame->client(), but there are still some edge cases // that this fails to catch during frame detach. if (m_frame->isLocalFrame() && !toLocalFrame(m_frame)->loader().documentLoader()) return; // Create a new environment using an empty template for the shadow // object. Reuse the global object if one has been created earlier. v8::Local<v8::ObjectTemplate> globalTemplate = V8Window::getShadowObjectTemplate(m_isolate); if (globalTemplate.IsEmpty()) return; double contextCreationStartInSeconds = currentTime(); // FIXME: It's not clear what the right thing to do for remote frames is. // The extensions registered don't generally seem to make sense for remote // frames, so skip it for now. Vector<const char*> extensionNames; if (m_frame->isLocalFrame()) { LocalFrame* frame = toLocalFrame(m_frame); // Dynamically tell v8 about our extensions now. const V8Extensions& extensions = ScriptController::registeredExtensions(); extensionNames.reserveInitialCapacity(extensions.size()); int extensionGroup = m_world->extensionGroup(); int worldId = m_world->worldId(); for (const auto* extension : extensions) { if (!frame->loader().client()->allowScriptExtension(extension->name(), extensionGroup, worldId)) continue; extensionNames.append(extension->name()); } } v8::ExtensionConfiguration extensionConfiguration(extensionNames.size(), extensionNames.data()); v8::Local<v8::Context> context = v8::Context::New(m_isolate, &extensionConfiguration, globalTemplate, m_global.newLocal(m_isolate)); if (context.IsEmpty()) return; m_scriptState = ScriptState::create(context, m_world); double contextCreationDurationInMilliseconds = (currentTime() - contextCreationStartInSeconds) * 1000; const char* histogramName = "WebCore.WindowProxy.createContext.MainWorld"; if (!m_world->isMainWorld()) histogramName = "WebCore.WindowProxy.createContext.IsolatedWorld"; Platform::current()->histogramCustomCounts(histogramName, contextCreationDurationInMilliseconds, 0, 10000, 50); }
void V8WindowShell::createContext() { // The activeDocumentLoader pointer could be 0 during frame shutdown. // FIXME: Can we remove this check? if (!m_frame->loader()->activeDocumentLoader()) return; // Create a new environment using an empty template for the shadow // object. Reuse the global object if one has been created earlier. v8::Handle<v8::ObjectTemplate> globalTemplate = V8Window::GetShadowObjectTemplate(m_isolate, m_world->isMainWorld() ? MainWorld : IsolatedWorld); if (globalTemplate.IsEmpty()) return; double contextCreationStartInSeconds = currentTime(); // Used to avoid sleep calls in unload handlers. ScriptController::registerExtensionIfNeeded(DateExtension::get()); // Dynamically tell v8 about our extensions now. const V8Extensions& extensions = ScriptController::registeredExtensions(); OwnArrayPtr<const char*> extensionNames = adoptArrayPtr(new const char*[extensions.size()]); int index = 0; int extensionGroup = m_world->extensionGroup(); int worldId = m_world->worldId(); for (size_t i = 0; i < extensions.size(); ++i) { // Ensure our date extension is always allowed. if (extensions[i] != DateExtension::get() && !m_frame->loader()->client()->allowScriptExtension(extensions[i]->name(), extensionGroup, worldId)) continue; extensionNames[index++] = extensions[i]->name(); } v8::ExtensionConfiguration extensionConfiguration(index, extensionNames.get()); v8::HandleScope handleScope(m_isolate); m_context.set(m_isolate, v8::Context::New(m_isolate, &extensionConfiguration, globalTemplate, m_global.newLocal(m_isolate))); double contextCreationDurationInMilliseconds = (currentTime() - contextCreationStartInSeconds) * 1000; const char* histogramName = "WebCore.V8WindowShell.createContext.MainWorld"; if (!m_world->isMainWorld()) histogramName = "WebCore.V8WindowShell.createContext.IsolatedWorld"; HistogramSupport::histogramCustomCounts(histogramName, contextCreationDurationInMilliseconds, 0, 10000, 50); }
void V8DOMWindowShell::createContext() { // The activeDocumentLoader pointer could be 0 during frame shutdown. // FIXME: Can we remove this check? if (!m_frame->loader()->activeDocumentLoader()) return; // Create a new environment using an empty template for the shadow // object. Reuse the global object if one has been created earlier. v8::Persistent<v8::ObjectTemplate> globalTemplate = V8DOMWindow::GetShadowObjectTemplate(); if (globalTemplate.IsEmpty()) return; // Used to avoid sleep calls in unload handlers. ScriptController::registerExtensionIfNeeded(DateExtension::get()); #if ENABLE(JAVASCRIPT_I18N_API) // Enables experimental i18n API in V8. if (RuntimeEnabledFeatures::javaScriptI18NAPIEnabled()) ScriptController::registerExtensionIfNeeded(v8_i18n::Extension::get()); #endif // Dynamically tell v8 about our extensions now. const V8Extensions& extensions = ScriptController::registeredExtensions(); OwnArrayPtr<const char*> extensionNames = adoptArrayPtr(new const char*[extensions.size()]); int index = 0; int extensionGroup = m_world->extensionGroup(); int worldId = m_world->worldId(); for (size_t i = 0; i < extensions.size(); ++i) { // Ensure our date extension is always allowed. if (extensions[i] != DateExtension::get() && !m_frame->loader()->client()->allowScriptExtension(extensions[i]->name(), extensionGroup, worldId)) continue; extensionNames[index++] = extensions[i]->name(); } v8::ExtensionConfiguration extensionConfiguration(index, extensionNames.get()); m_context.adopt(v8::Context::New(&extensionConfiguration, globalTemplate, m_global.get())); }
v8::Persistent<v8::Context> V8DOMWindowShell::createNewContext(v8::Handle<v8::Object> global, int extensionGroup) { v8::Persistent<v8::Context> result; // The activeDocumentLoader pointer could be 0 during frame shutdown. if (!m_frame->loader()->activeDocumentLoader()) return result; // Create a new environment using an empty template for the shadow // object. Reuse the global object if one has been created earlier. v8::Persistent<v8::ObjectTemplate> globalTemplate = V8DOMWindow::GetShadowObjectTemplate(); if (globalTemplate.IsEmpty()) return result; // Used to avoid sleep calls in unload handlers. if (!V8Proxy::registeredExtensionWithV8(DateExtension::get())) V8Proxy::registerExtension(DateExtension::get(), String()); // Dynamically tell v8 about our extensions now. const V8Extensions& extensions = V8Proxy::extensions(); OwnArrayPtr<const char*> extensionNames(new const char*[extensions.size()]); int index = 0; for (size_t i = 0; i < extensions.size(); ++i) { if (extensions[i].group && extensions[i].group != extensionGroup) continue; // Note: we check the loader URL here instead of the document URL // because we might be currently loading an URL into a blank page. // See http://code.google.com/p/chromium/issues/detail?id=10924 if (extensions[i].scheme.length() > 0 && (extensions[i].scheme != m_frame->loader()->activeDocumentLoader()->url().protocol())) continue; extensionNames[index++] = extensions[i].extension->name(); } v8::ExtensionConfiguration extensionConfiguration(index, extensionNames.get()); result = v8::Context::New(&extensionConfiguration, globalTemplate, global); return result; }
bool WorkerOrWorkletScriptController::initializeContextIfNeeded() { v8::HandleScope handleScope(m_isolate); if (isContextInitialized()) return true; // Create a new v8::Context with the worker/worklet as the global object // (aka the inner global). ScriptWrappable* scriptWrappable = m_globalScope->getScriptWrappable(); const WrapperTypeInfo* wrapperTypeInfo = scriptWrappable->wrapperTypeInfo(); v8::Local<v8::FunctionTemplate> globalInterfaceTemplate = wrapperTypeInfo->domTemplate(m_isolate, *m_world); if (globalInterfaceTemplate.IsEmpty()) return false; v8::Local<v8::ObjectTemplate> globalTemplate = globalInterfaceTemplate->InstanceTemplate(); v8::Local<v8::Context> context; { // Initialize V8 extensions before creating the context. Vector<const char*> extensionNames; if (m_globalScope->isServiceWorkerGlobalScope() && Platform::current()->allowScriptExtensionForServiceWorker( toWorkerGlobalScope(m_globalScope.get())->url())) { const V8Extensions& extensions = ScriptController::registeredExtensions(); extensionNames.reserveInitialCapacity(extensions.size()); for (const auto* extension : extensions) extensionNames.push_back(extension->name()); } v8::ExtensionConfiguration extensionConfiguration(extensionNames.size(), extensionNames.data()); V8PerIsolateData::UseCounterDisabledScope useCounterDisabled( V8PerIsolateData::from(m_isolate)); context = v8::Context::New(m_isolate, &extensionConfiguration, globalTemplate); } if (context.IsEmpty()) return false; m_scriptState = ScriptState::create(context, m_world); ScriptState::Scope scope(m_scriptState.get()); // The global proxy object. Note this is not the global object. v8::Local<v8::Object> globalProxy = context->Global(); V8DOMWrapper::setNativeInfo(m_isolate, globalProxy, wrapperTypeInfo, scriptWrappable); // The global object, aka worker/worklet wrapper object. v8::Local<v8::Object> globalObject = globalProxy->GetPrototype().As<v8::Object>(); globalObject = V8DOMWrapper::associateObjectWithWrapper( m_isolate, scriptWrappable, wrapperTypeInfo, globalObject); // All interfaces must be registered to V8PerContextData. // So we explicitly call constructorForType for the global object. V8PerContextData::from(context)->constructorForType(wrapperTypeInfo); // Name new context for debugging. For main thread worklet global scopes // this is done once the context is initialized. if (m_globalScope->isWorkerGlobalScope() || m_globalScope->isThreadedWorkletGlobalScope()) { WorkerThreadDebugger* debugger = WorkerThreadDebugger::from(m_isolate); debugger->contextCreated(m_globalScope->thread(), context); } return true; }