nsresult nsDOMStorageDBWrapper::CreateScopeDBKey(nsIPrincipal* aPrincipal, nsACString& aKey) { nsCOMPtr<nsIURI> uri; nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri)); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(uri, NS_ERROR_UNEXPECTED); nsAutoCString domainScope; rv = uri->GetAsciiHost(domainScope); NS_ENSURE_SUCCESS(rv, rv); if (domainScope.IsEmpty()) { // About pages have an empty host but a valid path. Since they are handled // internally by our own redirector, we can trust them and use path as key. // if file:/// protocol, let's make the exact directory the domain bool isScheme = false; if ((NS_SUCCEEDED(uri->SchemeIs("about", &isScheme)) && isScheme) || (NS_SUCCEEDED(uri->SchemeIs("moz-safe-about", &isScheme)) && isScheme)) { rv = uri->GetPath(domainScope); NS_ENSURE_SUCCESS(rv, rv); // While the host is always canonicalized to lowercase, the path is not, // thus need to force the casing. ToLowerCase(domainScope); } else if (NS_SUCCEEDED(uri->SchemeIs("file", &isScheme)) && isScheme) { nsCOMPtr<nsIURL> url = do_QueryInterface(uri, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = url->GetDirectory(domainScope); NS_ENSURE_SUCCESS(rv, rv); } } nsAutoCString key; rv = CreateReversedDomain(domainScope, key); NS_ENSURE_SUCCESS(rv, rv); nsAutoCString scheme; rv = uri->GetScheme(scheme); NS_ENSURE_SUCCESS(rv, rv); key.Append(NS_LITERAL_CSTRING(":") + scheme); int32_t port = NS_GetRealPort(uri); if (port != -1) { key.Append(nsPrintfCString(":%d", port)); } uint32_t appId; rv = aPrincipal->GetAppId(&appId); NS_ENSURE_SUCCESS(rv, rv); bool isInBrowserElement; rv = aPrincipal->GetIsInBrowserElement(&isInBrowserElement); NS_ENSURE_SUCCESS(rv, rv); if (appId == nsIScriptSecurityManager::NO_APP_ID && !isInBrowserElement) { aKey.Assign(key); return NS_OK; } aKey.Truncate(); aKey.AppendInt(appId); aKey.Append(NS_LITERAL_CSTRING(":") + (isInBrowserElement ? NS_LITERAL_CSTRING("t") : NS_LITERAL_CSTRING("f")) + NS_LITERAL_CSTRING(":") + key); return NS_OK; }