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; |
} |