void ScriptController::evaluateInIsolatedWorld(int worldID, const Vector<ScriptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) { ASSERT(worldID > 0); v8::HandleScope handleScope; v8::Local<v8::Array> v8Results; { v8::HandleScope evaluateHandleScope; RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(worldID, extensionGroup); V8DOMWindowShell* isolatedWorldShell = windowShell(world.get()); if (!isolatedWorldShell->isContextInitialized()) return; v8::Local<v8::Context> context = isolatedWorldShell->context(); v8::Context::Scope contextScope(context); v8::Local<v8::Array> resultArray = v8::Array::New(sources.size()); for (size_t i = 0; i < sources.size(); ++i) { v8::Local<v8::Value> evaluationResult = compileAndRunScript(sources[i]); if (evaluationResult.IsEmpty()) evaluationResult = v8::Local<v8::Value>::New(v8::Undefined()); resultArray->Set(i, evaluationResult); } v8Results = evaluateHandleScope.Close(resultArray); } if (results && !v8Results.IsEmpty()) { for (size_t i = 0; i < v8Results->Length(); ++i) results->append(ScriptValue(v8Results->Get(i))); } }
void ScriptController::evaluateInIsolatedWorld(int worldID, const Vector<ScriptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) { // Except in the test runner, worldID should be non 0 as it conflicts with the mainWorldId. // FIXME: Change the test runner to perform this swap and make this an ASSERT. if (UNLIKELY(!worldID)) worldID = DOMWrapperWorld::uninitializedWorldId; v8::HandleScope handleScope; v8::Local<v8::Array> v8Results; { v8::HandleScope evaluateHandleScope; V8DOMWindowShell* isolatedWorldShell = ensureIsolatedWorldContext(worldID, extensionGroup); if (worldID != DOMWrapperWorld::uninitializedWorldId) { IsolatedWorldSecurityOriginMap::iterator securityOriginIter = m_isolatedWorldSecurityOrigins.find(worldID); if (securityOriginIter != m_isolatedWorldSecurityOrigins.end()) isolatedWorldShell->setIsolatedWorldSecurityOrigin(securityOriginIter->value); } isolatedWorldShell->initializeIfNeeded(); if (isolatedWorldShell->context().IsEmpty()) return; v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolatedWorldShell->context()); v8::Context::Scope contextScope(context); v8::Local<v8::Array> resultArray = v8::Array::New(sources.size()); for (size_t i = 0; i < sources.size(); ++i) { v8::Local<v8::Value> evaluationResult = compileAndRunScript(sources[i]); if (evaluationResult.IsEmpty()) evaluationResult = v8::Local<v8::Value>::New(v8::Undefined()); resultArray->Set(i, evaluationResult); } // Mark temporary shell for weak destruction. if (worldID == DOMWrapperWorld::uninitializedWorldId) { int actualWorldId = isolatedWorldShell->world()->worldId(); m_isolatedWorlds.remove(actualWorldId); isolatedWorldShell->destroyIsolatedShell(); } v8Results = evaluateHandleScope.Close(resultArray); } if (results && !v8Results.IsEmpty()) { for (size_t i = 0; i < v8Results->Length(); ++i) results->append(ScriptValue(v8Results->Get(i))); } }
ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode) { String sourceURL = sourceCode.url(); const String* savedSourceURL = m_sourceURL; m_sourceURL = &sourceURL; v8::HandleScope handleScope; v8::Handle<v8::Context> v8Context = ScriptController::mainWorldContext(m_frame); if (v8Context.IsEmpty()) return ScriptValue(); v8::Context::Scope scope(v8Context); RefPtr<Frame> protect(m_frame); v8::Local<v8::Value> object = compileAndRunScript(sourceCode); m_sourceURL = savedSourceURL; if (object.IsEmpty()) return ScriptValue(); return ScriptValue(object); }