static void messageHandlerInMainThread(v8::Handle<v8::Message> message, v8::Handle<v8::Value> data) { DOMWindow* firstWindow = firstDOMWindow(); if (!firstWindow->isCurrentlyDisplayedInFrame()) return; String errorMessage = toWebCoreString(message->Get()); v8::Handle<v8::StackTrace> stackTrace = message->GetStackTrace(); RefPtr<ScriptCallStack> callStack; // Currently stack trace is only collected when inspector is open. if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) callStack = createScriptCallStack(stackTrace, ScriptCallStack::maxCallStackSizeToCapture); v8::Handle<v8::Value> resourceName = message->GetScriptResourceName(); bool shouldUseDocumentURL = resourceName.IsEmpty() || !resourceName->IsString(); String resource = shouldUseDocumentURL ? firstWindow->document()->url() : toWebCoreString(resourceName); RefPtr<ErrorEvent> event = ErrorEvent::create(errorMessage, resource, message->GetLineNumber(), message->GetStartColumn()); // messageHandlerInMainThread can be called while we're creating a new context. // Since we cannot create a wrapper in the intermediate timing, we need to skip // creating a wrapper for |event|. DOMWrapperWorld* world = DOMWrapperWorld::current(); Frame* frame = firstWindow->document()->frame(); if (world && frame && frame->script()->existingWindowShell(world)) { v8::Local<v8::Value> wrappedEvent = toV8(event.get(), v8::Handle<v8::Object>(), v8::Isolate::GetCurrent()); if (!wrappedEvent.IsEmpty()) { ASSERT(wrappedEvent->IsObject()); v8::Local<v8::Object>::Cast(wrappedEvent)->SetHiddenValue(V8HiddenPropertyName::error(), data); } } AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin; firstWindow->document()->reportException(event.release(), callStack, corsStatus); }
static v8::Local<v8::Context> toV8Context(NPP npp, NPObject* npObject) { V8NPObject* object = reinterpret_cast<V8NPObject*>(npObject); DOMWindow* window = object->rootObject; if (!window || !window->isCurrentlyDisplayedInFrame()) return v8::Local<v8::Context>(); return ScriptController::mainWorldContext(object->rootObject->frame()); }
static v8::Local<v8::Context> mainWorldContext(v8::Isolate* isolate, NPP npp, NPObject* npObject) { ASSERT(npObject->_class == &V8NPObjectClass); V8NPObject* object = reinterpret_cast<V8NPObject*>(npObject); DOMWindow* window = object->rootObject; if (!window || !window->isCurrentlyDisplayedInFrame()) return v8::Local<v8::Context>(); return toV8Context(isolate, object->rootObject->frame(), DOMWrapperWorld::mainWorld()); }
Frame* toFrameIfNotDetached(v8::Handle<v8::Context> context) { DOMWindow* window = toDOMWindow(context); if (window->isCurrentlyDisplayedInFrame()) return window->frame(); // We return 0 here because |context| is detached from the Frame. If we // did return |frame| we could get in trouble because the frame could be // navigated to another security origin. return 0; }
RefPtr<Database> DOMWindowWebDatabase::openDatabase(DOMWindow& window, const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec) { if (!window.isCurrentlyDisplayedInFrame()) return nullptr; RefPtr<Database> database = nullptr; DatabaseManager& dbManager = DatabaseManager::singleton(); DatabaseError error = DatabaseError::None; if (dbManager.isAvailable() && window.document()->securityOrigin()->canAccessDatabase(window.document()->topOrigin())) { database = dbManager.openDatabase(window.document(), name, version, displayName, estimatedSize, creationCallback, error); ASSERT(database || error != DatabaseError::None); ec = DatabaseManager::exceptionCodeForDatabaseError(error); } else ec = SECURITY_ERR; return database; }
static void reportUncaughtException(v8::Handle<v8::Message> message, v8::Handle<v8::Value> data) { DOMWindow* firstWindow = firstDOMWindow(BindingState::instance()); if (!firstWindow->isCurrentlyDisplayedInFrame()) return; String errorMessage = toWebCoreString(message->Get()); v8::Handle<v8::StackTrace> stackTrace = message->GetStackTrace(); RefPtr<ScriptCallStack> callStack; // Currently stack trace is only collected when inspector is open. if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) callStack = createScriptCallStack(stackTrace, ScriptCallStack::maxCallStackSizeToCapture); v8::Handle<v8::Value> resourceName = message->GetScriptResourceName(); bool shouldUseDocumentURL = resourceName.IsEmpty() || !resourceName->IsString(); String resource = shouldUseDocumentURL ? firstWindow->document()->url() : toWebCoreString(resourceName); firstWindow->document()->reportException(errorMessage, message->GetLineNumber(), resource, callStack); }
PassRefPtr<Database> DOMWindowWebDatabase::openDatabase(DOMWindow& window, const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassOwnPtr<DatabaseCallback> creationCallback, ExceptionState& exceptionState) { if (!window.isCurrentlyDisplayedInFrame()) return nullptr; RefPtr<Database> database = nullptr; DatabaseManager& dbManager = DatabaseManager::manager(); DatabaseError error = DatabaseError::None; if (RuntimeEnabledFeatures::databaseEnabled() && window.document()->securityOrigin()->canAccessDatabase()) { String errorMessage; database = dbManager.openDatabase(window.document(), name, version, displayName, estimatedSize, creationCallback, error, errorMessage); ASSERT(database || error != DatabaseError::None); if (error != DatabaseError::None) DatabaseManager::throwExceptionForDatabaseError(error, errorMessage, exceptionState); } else { exceptionState.throwSecurityError("Access to the WebDatabase API is denied in this context."); } return database; }
ExceptionOr<RefPtr<Database>> DOMWindowWebDatabase::openDatabase(DOMWindow& window, const String& name, const String& version, const String& displayName, unsigned estimatedSize, RefPtr<DatabaseCallback>&& creationCallback) { if (!window.isCurrentlyDisplayedInFrame()) return RefPtr<Database> { nullptr }; auto& manager = DatabaseManager::singleton(); if (!manager.isAvailable()) return Exception { SecurityError }; auto* document = window.document(); if (!document) return Exception { SecurityError }; document->addConsoleMessage(MessageSource::Storage, MessageLevel::Warning, "Web SQL is deprecated. Please use IndexedDB instead."); auto& securityOrigin = document->securityOrigin(); if (!securityOrigin.canAccessDatabase(document->topOrigin())) return Exception { SecurityError }; auto result = manager.openDatabase(*window.document(), name, version, displayName, estimatedSize, WTFMove(creationCallback)); if (result.hasException()) { // FIXME: To preserve our past behavior, this discards the error string in the exception. // At a later time we may decide that we want to use the error strings, and if so we can just return the exception as is. return Exception { result.releaseException().code() }; } return RefPtr<Database> { result.releaseReturnValue() }; }