void V8Proxy::clearForNavigation() { disconnectEventListeners(); if (!context().IsEmpty()) { v8::HandleScope handle; clearDocumentWrapper(); 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. clearDocumentWrapperCache(); // Turn on access check on the old DOMWindow wrapper. v8::Handle<v8::Object> wrapper = V8DOMWrapper::lookupDOMWrapper(V8ClassIndex::DOMWINDOW, m_global); ASSERT(!wrapper.IsEmpty()); wrapper->TurnOnAccessCheck(); // Separate the context from its global object. context()->DetachGlobal(); disposeContextHandles(); } }
void V8Proxy::clearForClose() { if (!context().IsEmpty()) { v8::HandleScope handleScope; clearDocumentWrapper(); disposeContextHandles(); } }
void V8DOMWindowShell::clearForClose() { if (!m_context.IsEmpty()) { v8::HandleScope handleScope; clearDocumentWrapper(); disposeContextHandles(); } }
void V8Proxy::updateDocumentWrapper(v8::Handle<v8::Value> wrapper) { clearDocumentWrapper(); ASSERT(m_document.IsEmpty()); m_document = v8::Persistent<v8::Value>::New(wrapper); #ifndef NDEBUG V8GCController::registerGlobalHandle(PROXY, this, m_document); #endif }
void V8DOMWindowShell::clearForNavigation() { if (!m_context.IsEmpty()) { v8::HandleScope handle; clearDocumentWrapper(); v8::Context::Scope contextScope(m_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. clearDocumentWrapperCache(); // Turn on access check on the old DOMWindow wrapper. v8::Handle<v8::Object> wrapper = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), m_global); ASSERT(!wrapper.IsEmpty()); wrapper->TurnOnAccessCheck(); // Separate the context from its global object. m_context->DetachGlobal(); disposeContextHandles(); } }
bool V8Proxy::isEnabled() { Settings* settings = m_frame->settings(); if (!settings) return false; // In the common case, JavaScript is enabled and we're done. if (settings->isJavaScriptEnabled()) return true; // If JavaScript has been disabled, we need to look at the frame to tell // whether this script came from the web or the embedder. Scripts from the // embedder are safe to run, but scripts from the other sources are // disallowed. Document* document = m_frame->document(); if (!document) return false; SecurityOrigin* origin = document->securityOrigin(); if (origin->protocol().isEmpty()) return false; // Uninitialized document if (origin->protocol() == "http" || origin->protocol() == "https") return false; // Web site // FIXME: the following are application decisions, and they should // not be made at this layer. instead, we should bridge out to the // embedder to allow them to override policy here. #if PLATFORM(CHROMIUM) // TODO(andreip): ChromeBridge->BrowserBridge? if (origin->protocol() == ChromiumBridge::uiResourceProtocol()) return true; // Embedder's scripts are ok to run #endif // If the scheme is ftp: or file:, an empty file name indicates a directory // listing, which requires JavaScript to function properly. const char* kDirProtocols[] = { "ftp", "file" }; #if PLATFORM(ANDROID) // TODO(andreip): Port arraysize function to Android. There's one in Gears. for (size_t i = 0; i < 2; ++i) { #else for (size_t i = 0; i < arraysize(kDirProtocols); ++i) { #endif if (origin->protocol() == kDirProtocols[i]) { const KURL& url = document->url(); return url.pathAfterLastSlash() == url.pathEnd(); } } return false; // Other protocols fall through to here } void V8Proxy::updateDocumentWrapper(v8::Handle<v8::Value> wrapper) { clearDocumentWrapper(); ASSERT(m_document.IsEmpty()); m_document = v8::Persistent<v8::Value>::New(wrapper); #ifndef NDEBUG V8GCController::registerGlobalHandle(PROXY, this, m_document); #endif }