ScriptValue WorkerContextExecutionProxy::evaluate(const String& script, const String& fileName, int baseLine, WorkerContextExecutionState* state) { v8::HandleScope hs; initContextIfNeeded(); v8::Context::Scope scope(m_context); v8::TryCatch exceptionCatcher; v8::Local<v8::String> scriptString = v8ExternalString(script); v8::Handle<v8::Script> compiledScript = V8Proxy::compileScript(scriptString, fileName, baseLine); v8::Local<v8::Value> result = runScript(compiledScript); if (exceptionCatcher.HasCaught()) { v8::Local<v8::Message> message = exceptionCatcher.Message(); state->hadException = true; state->exception = ScriptValue(exceptionCatcher.Exception()); state->errorMessage = toWebCoreString(message->Get()); state->lineNumber = message->GetLineNumber(); state->sourceURL = toWebCoreString(message->GetScriptResourceName()); exceptionCatcher.Reset(); } else state->hadException = false; if (result.IsEmpty() || result->IsUndefined()) return ScriptValue(); return ScriptValue(result); }
void V8DOMWindowShell::namedItemAdded(HTMLDocument* doc, const AtomicString& name) { initContextIfNeeded(); v8::HandleScope handleScope; v8::Context::Scope contextScope(m_context); ASSERT(!m_document.IsEmpty()); checkDocumentWrapper(m_document, doc); m_document->SetAccessor(v8String(name), getter); }
v8::Local<v8::Object> V8DOMWindowShell::createWrapperFromCacheSlowCase(WrapperTypeInfo* type) { // Not in cache. initContextIfNeeded(); v8::Context::Scope scope(m_context); v8::Local<v8::Function> function = V8DOMWrapper::getConstructor(type, getHiddenObjectPrototype(m_context)); v8::Local<v8::Object> instance = SafeAllocation::newInstance(function); if (!instance.IsEmpty()) { m_wrapperBoilerplates.set(type, v8::Persistent<v8::Object>::New(instance)); return instance->Clone(); } return notHandledByInterceptor(); }
v8::Local<v8::Object> V8Proxy::createWrapperFromCacheSlowCase(V8ClassIndex::V8WrapperType type) { // Not in cache. int classIndex = V8ClassIndex::ToInt(type); initContextIfNeeded(); v8::Context::Scope scope(context()); v8::Local<v8::Function> function = V8DOMWrapper::getConstructor(type, getHiddenObjectPrototype(context())); v8::Local<v8::Object> instance = SafeAllocation::newInstance(function); if (!instance.IsEmpty()) { m_wrapperBoilerplates->Set(v8::Integer::New(classIndex), instance); return instance->Clone(); } return notHandledByInterceptor(); }
void V8Proxy::evaluateInNewContext(const Vector<ScriptSourceCode>& sources, int extensionGroup) { initContextIfNeeded(); v8::HandleScope handleScope; // Set up the DOM window as the prototype of the new global object. v8::Handle<v8::Context> windowContext = context(); v8::Handle<v8::Object> windowGlobal = windowContext->Global(); v8::Handle<v8::Object> windowWrapper = V8DOMWrapper::lookupDOMWrapper(V8ClassIndex::DOMWINDOW, windowGlobal); ASSERT(V8DOMWrapper::convertDOMWrapperToNative<DOMWindow>(windowWrapper) == m_frame->domWindow()); v8::Persistent<v8::Context> context = createNewContext(v8::Handle<v8::Object>(), extensionGroup); v8::Context::Scope contextScope(context); // Setup context id for JS debugger. v8::Handle<v8::Object> contextData = v8::Object::New(); v8::Handle<v8::Value> windowContextData = windowContext->GetData(); if (windowContextData->IsObject()) { v8::Handle<v8::String> propertyName = v8::String::New(kContextDebugDataValue); contextData->Set(propertyName, v8::Object::Cast(*windowContextData)->Get(propertyName)); } contextData->Set(v8::String::New(kContextDebugDataType), v8::String::New("injected")); context->SetData(contextData); v8::Handle<v8::Object> global = context->Global(); v8::Handle<v8::String> implicitProtoString = v8::String::New("__proto__"); global->Set(implicitProtoString, windowWrapper); // Give the code running in the new context a way to get access to the // original context. global->Set(v8::String::New("contentWindow"), windowGlobal); m_frame->loader()->client()->didCreateIsolatedScriptContext(); // Run code in the new context. for (size_t i = 0; i < sources.size(); ++i) evaluate(sources[i], 0); // Using the default security token means that the canAccess is always // called, which is slow. // FIXME: Use tokens where possible. This will mean keeping track of all // created contexts so that they can all be updated when the document domain // changes. context->UseDefaultSecurityToken(); context.Dispose(); }
void V8Proxy::updateDocument() { if (!m_frame->document()) return; if (m_global.IsEmpty()) return; // There is an existing JavaScript wrapper for the global object // of this frame. JavaScript code in other frames might hold a // reference to this wrapper. We eagerly initialize the JavaScript // context for the new document to make property access on the // global object wrapper succeed. initContextIfNeeded(); // We have a new document and we need to update the cache. updateDocumentWrapperCache(); updateSecurityOrigin(); }
ScriptValue WorkerContextExecutionProxy::evaluate(const String& script, const String& fileName, const TextPosition0& scriptStartPosition, WorkerContextExecutionState* state) { v8::HandleScope hs; if (!initContextIfNeeded()) return ScriptValue(); v8::Context::Scope scope(m_context); v8::TryCatch exceptionCatcher; v8::Local<v8::String> scriptString = v8ExternalString(script); v8::Handle<v8::Script> compiledScript = V8Proxy::compileScript(scriptString, fileName, scriptStartPosition); v8::Local<v8::Value> result = runScript(compiledScript); if (!exceptionCatcher.CanContinue()) { m_workerContext->script()->forbidExecution(); return ScriptValue(); } if (exceptionCatcher.HasCaught()) { v8::Local<v8::Message> message = exceptionCatcher.Message(); state->hadException = true; state->errorMessage = toWebCoreString(message->Get()); state->lineNumber = message->GetLineNumber(); state->sourceURL = toWebCoreString(message->GetScriptResourceName()); int c=0; if (m_workerContext->sanitizeScriptError(state->errorMessage, state->lineNumber,c, state->sourceURL)) state->exception = V8Proxy::throwError(V8Proxy::GeneralError, state->errorMessage.utf8().data()); else state->exception = ScriptValue(exceptionCatcher.Exception()); exceptionCatcher.Reset(); } else state->hadException = false; if (result.IsEmpty() || result->IsUndefined()) return ScriptValue(); return ScriptValue(result); }
void V8Proxy::evaluateInNewWorld(const Vector<ScriptSourceCode>& sources, int extensionGroup) { initContextIfNeeded(); V8IsolatedWorld::evaluate(sources, this, extensionGroup); }