| Index: Source/bindings/v8/V8DOMWindowShell.cpp
|
| diff --git a/Source/bindings/v8/V8DOMWindowShell.cpp b/Source/bindings/v8/V8DOMWindowShell.cpp
|
| index 6cc480b8b802e12d2826f9be8199fcc27176faa8..6e214b0bf4ed33168ba0048b4884c0a0447b9436 100644
|
| --- a/Source/bindings/v8/V8DOMWindowShell.cpp
|
| +++ b/Source/bindings/v8/V8DOMWindowShell.cpp
|
| @@ -79,6 +79,28 @@ static void setInjectedScriptContextDebugId(v8::Handle<v8::Context> targetContex
|
| V8PerContextDebugData::setContextDebugData(targetContext, "injected", debugId);
|
| }
|
|
|
| +V8DOMWindowShell::ContextScope::ContextScope(V8DOMWindowShell* shell, ContextDescriptor descriptor)
|
| + : m_scope(descriptor == DomContext ? shell->m_context.newLocal(shell->m_isolate) : shell->m_contextForBlinkJS.newLocal(shell->m_isolate))
|
| +{
|
| +}
|
| +
|
| +V8DOMWindowShell* V8DOMWindowShell::ContextScope::currentWindowShell()
|
| +{
|
| + DOMWindow* window = activeDOMWindow();
|
| + if (!window)
|
| + return 0;
|
| + Document* document = window->document();
|
| + if (!document)
|
| + return 0;
|
| + Frame* frame = document->frame();
|
| + if (!frame)
|
| + return 0;
|
| + ScriptController* script = frame->script();
|
| + if (!script)
|
| + return 0;
|
| + return script->windowShell(DOMWrapperWorld::current());
|
| +}
|
| +
|
| PassOwnPtr<V8DOMWindowShell> V8DOMWindowShell::create(Frame* frame, PassRefPtr<DOMWrapperWorld> world, v8::Isolate* isolate)
|
| {
|
| return adoptPtr(new V8DOMWindowShell(frame, world, isolate));
|
| @@ -94,6 +116,7 @@ V8DOMWindowShell::V8DOMWindowShell(Frame* frame, PassRefPtr<DOMWrapperWorld> wor
|
| void V8DOMWindowShell::disposeContext()
|
| {
|
| m_perContextData.clear();
|
| + m_perContextDataForBlinkJS.clear();
|
|
|
| if (m_context.isEmpty())
|
| return;
|
| @@ -102,6 +125,7 @@ void V8DOMWindowShell::disposeContext()
|
| m_frame->loader()->client()->willReleaseScriptContext(m_context.newLocal(m_isolate), m_world->worldId());
|
|
|
| m_context.clear();
|
| + m_contextForBlinkJS.clear();
|
|
|
| // It's likely that disposing the context has created a lot of
|
| // garbage. Notify V8 about this so it'll have a chance of cleaning
|
| @@ -221,6 +245,18 @@ bool V8DOMWindowShell::initializeIfNeeded()
|
| return false;
|
| }
|
| m_perContextData->setActivityLogger(DOMWrapperWorld::activityLogger(m_world->worldId()));
|
| +
|
| + {
|
| + v8::Handle<v8::Context> contextForBlinkJS = m_contextForBlinkJS.newLocal(m_isolate);
|
| + v8::Context::Scope contextScope(contextForBlinkJS);
|
| + m_perContextDataForBlinkJS = V8PerContextData::create(contextForBlinkJS);
|
| + if (!m_perContextDataForBlinkJS->init()) {
|
| + disposeContext();
|
| + return false;
|
| + }
|
| + m_perContextDataForBlinkJS->setActivityLogger(DOMWrapperWorld::activityLogger(m_world->worldId()));
|
| + }
|
| +
|
| if (!installDOMWindow()) {
|
| disposeContext();
|
| return false;
|
| @@ -293,6 +329,7 @@ void V8DOMWindowShell::createContext()
|
|
|
| v8::HandleScope handleScope(m_isolate);
|
| m_context.set(m_isolate, v8::Context::New(m_isolate, &extensionConfiguration, globalTemplate, m_global.newLocal(m_isolate)));
|
| + m_contextForBlinkJS.set(m_isolate, v8::Context::New(m_isolate, 0, globalTemplate));
|
|
|
| double contextCreationDurationInMilliseconds = (currentTime() - contextCreationStartInSeconds) * 1000;
|
| const char* histogramName = "WebCore.V8DOMWindowShell.createContext.MainWorld";
|
| @@ -330,6 +367,12 @@ bool V8DOMWindowShell::installDOMWindow()
|
| V8DOMWrapper::setNativeInfo(innerGlobalObject, &V8DOMWindow::info, window);
|
| innerGlobalObject->SetPrototype(windowWrapper);
|
| V8DOMWrapper::associateObjectWithWrapper(PassRefPtr<DOMWindow>(window), &V8DOMWindow::info, windowWrapper, m_isolate, WrapperConfiguration::Dependent);
|
| +
|
| + v8::Handle<v8::Object> innerGlobalObjectForBlinkJS = toInnerGlobalObject(m_contextForBlinkJS.newLocal(m_isolate));
|
| + V8DOMWrapper::setNativeInfo(innerGlobalObjectForBlinkJS, &V8DOMWindow::info, window);
|
| + innerGlobalObjectForBlinkJS->SetPrototype(windowWrapper);
|
| + V8DOMWrapper::associateObjectWithWrapper(PassRefPtr<DOMWindow>(window), &V8DOMWindow::info, windowWrapper, m_isolate, WrapperConfiguration::Dependent);
|
| +
|
| DOMWrapperWorld::setInitializingWindow(false);
|
| return true;
|
| }
|
|
|