void V8DOMWindowShell::updateDocumentProperty() { if (!m_world->isMainWorld()) return; v8::HandleScope handleScope; // FIXME: Should we use a new Local handle here? v8::Context::Scope contextScope(m_context.get()); v8::Handle<v8::Value> documentWrapper = toV8(m_frame->document()); ASSERT(documentWrapper == m_document.get() || m_document.isEmpty()); if (m_document.isEmpty()) updateDocumentWrapper(v8::Handle<v8::Object>::Cast(documentWrapper)); checkDocumentWrapper(m_document.get(), m_frame->document()); // If instantiation of the document wrapper fails, clear the cache // and let the DOMWindow accessor handle access to the document. if (documentWrapper.IsEmpty()) { clearDocumentProperty(); return; } ASSERT(documentWrapper->IsObject()); m_context->Global()->ForceSet(v8::String::New("document"), documentWrapper, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); // We also stash a reference to the document on the inner global object so that // DOMWindow objects we obtain from JavaScript references are guaranteed to have // live Document objects. toInnerGlobalObject(m_context.get())->SetHiddenValue(V8HiddenPropertyName::document(), documentWrapper); }
void WindowProxy::clearForNavigation() { if (!isContextInitialized()) return; ScriptState::Scope scope(m_scriptState.get()); m_document.clear(); // Clear the document wrapper cache before turning on access checks on // the old LocalDOMWindow wrapper. This way, access to the document wrapper // will be protected by the security checks on the LocalDOMWindow wrapper. clearDocumentProperty(); v8::Handle<v8::Object> windowWrapper = V8Window::findInstanceInPrototypeChain(m_global.newLocal(m_isolate), m_isolate); ASSERT(!windowWrapper.IsEmpty()); windowWrapper->TurnOnAccessCheck(); disposeContext(DetachGlobal); }
void V8WindowShell::clearForNavigation() { if (!m_contextHolder) return; v8::HandleScope handleScope(m_isolate); m_document.clear(); v8::Handle<v8::Context> context = m_contextHolder->context(); v8::Context::Scope contextScope(context); // Clear the document wrapper cache before turning on access checks on // the old DOMWindow wrapper. This way, access to the document wrapper // will be protected by the security checks on the DOMWindow wrapper. clearDocumentProperty(); v8::Handle<v8::Object> windowWrapper = m_global.newLocal(m_isolate)->FindInstanceInPrototypeChain(V8Window::domTemplate(m_isolate, worldTypeInMainThread(m_isolate))); ASSERT(!windowWrapper.IsEmpty()); windowWrapper->TurnOnAccessCheck(); disposeContext(DetachGlobal); }
void V8DOMWindowShell::clearForNavigation() { if (m_context.isEmpty()) return; v8::HandleScope handleScope; m_document.clear(); // FIXME: Should we create a new Local handle here? v8::Context::Scope contextScope(m_context.get()); // Clear the document wrapper cache before turning on access checks on // the old DOMWindow wrapper. This way, access to the document wrapper // will be protected by the security checks on the DOMWindow wrapper. clearDocumentProperty(); v8::Handle<v8::Object> windowWrapper = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), m_global.get()); ASSERT(!windowWrapper.IsEmpty()); windowWrapper->TurnOnAccessCheck(); m_context->DetachGlobal(); disposeContext(); }
void WindowProxy::updateDocumentProperty() { ScriptState::Scope scope(m_scriptState.get()); v8::Handle<v8::Context> context = m_scriptState->context(); v8::Handle<v8::Value> documentWrapper = toV8(m_frame->document(), context->Global(), context->GetIsolate()); ASSERT(documentWrapper == m_document.newLocal(m_isolate) || m_document.isEmpty()); if (m_document.isEmpty()) updateDocumentWrapper(v8::Handle<v8::Object>::Cast(documentWrapper)); // If instantiation of the document wrapper fails, clear the cache // and let the LocalDOMWindow accessor handle access to the document. if (documentWrapper.IsEmpty()) { clearDocumentProperty(); return; } ASSERT(documentWrapper->IsObject()); context->Global()->ForceSet(v8AtomicString(m_isolate, "document"), documentWrapper, static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete)); // We also stash a reference to the document on the inner global object so that // LocalDOMWindow objects we obtain from JavaScript references are guaranteed to have // live Document objects. V8HiddenValue::setHiddenValue(m_isolate, toInnerGlobalObject(context), V8HiddenValue::document(m_isolate), documentWrapper); }