NS_IMETHODIMP nsDOMStorage::Key(PRUint32 aIndex, nsAString& aKey) { // XXXjst: This is as retarded as the DOM spec is, takes an unsigned // int, but the spec talks about what to do if a negative value is // passed in. // XXX: This does a linear search for the key at index, which would // suck if there's a large numer of indexes. Do we care? If so, // maybe we need to have a lazily populated key array here or // something? if (!CacheStoragePermissions()) return NS_ERROR_DOM_SECURITY_ERR; if (UseDB()) CacheKeysFromDB(); IndexFinderData data(IsCallerSecure(), aIndex); mItems.EnumerateEntries(IndexFinder, &data); if (!data.mItem) { // aIndex was larger than the number of accessible keys. Throw. return NS_ERROR_DOM_INDEX_SIZE_ERR; } aKey = data.mItem->GetKey(); return NS_OK; }
nsresult nsDOMStorage::Clear() { if (!CacheStoragePermissions()) return NS_ERROR_DOM_SECURITY_ERR; if (UseDB()) CacheKeysFromDB(); PRBool foundSecureItem = PR_FALSE; mItems.EnumerateEntries(CheckSecure, &foundSecureItem); if (foundSecureItem && !IsCallerSecure()) { return NS_ERROR_DOM_SECURITY_ERR; } #ifdef MOZ_STORAGE if (UseDB()) { nsresult rv = InitDB(); NS_ENSURE_SUCCESS(rv, rv); rv = gStorageDB->ClearStorage(this); NS_ENSURE_SUCCESS(rv, rv); } #endif mItems.Clear(); BroadcastChangeNotification(); return NS_OK; }
nsTArray<nsString> * nsDOMStorage::GetKeys() { if (UseDB()) CacheKeysFromDB(); KeysArrayBuilderStruct keystruct; keystruct.callerIsSecure = IsCallerSecure(); keystruct.keys = new nsTArray<nsString>(); if (keystruct.keys) mItems.EnumerateEntries(KeysArrayBuilder, &keystruct); return keystruct.keys; }
NS_IMETHODIMP nsDOMStorage::GetLength(PRUint32 *aLength) { if (!CacheStoragePermissions()) return NS_ERROR_DOM_SECURITY_ERR; if (UseDB()) CacheKeysFromDB(); ItemCounterState state(IsCallerSecure()); mItems.EnumerateEntries(ItemCounter, &state); *aLength = state.mCount; return NS_OK; }
NS_IMETHODIMP nsDOMStorage::GetLength(PRUint32 *aLength) { if (!CacheStoragePermissions()) return NS_ERROR_DOM_SECURITY_ERR; // Force reload of items from database. This ensures sync localStorages for // same origins among different windows. mItemsCached = PR_FALSE; if (UseDB()) CacheKeysFromDB(); ItemCounterState state(IsCallerSecure()); mItems.EnumerateEntries(ItemCounter, &state); *aLength = state.mCount; return NS_OK; }