void GmodelExp::TraceTree(INode* node) { if ( NodeFilter(node) ) { AddNode(node); } for (int c = 0; c < node->NumberOfChildren(); c++) { TraceTree(node->GetChildNode(c)); } }
void GeckoMediaPluginServiceParent::ClearNodeIdAndPlugin(DirectoryFilter& aFilter) { nsresult rv; nsCOMPtr<nsIFile> path; // $profileDir/gmp/ rv = GetStorageDir(getter_AddRefs(path)); if (NS_FAILED(rv)) { return; } // $profileDir/gmp/id/ rv = path->AppendNative(NS_LITERAL_CSTRING("id")); if (NS_FAILED(rv)) { return; } // Iterate all sub-folders of $profileDir/gmp/id/ nsCOMPtr<nsISimpleEnumerator> iter; rv = path->GetDirectoryEntries(getter_AddRefs(iter)); if (NS_FAILED(rv)) { return; } bool hasMore = false; nsTArray<nsCString> nodeIDsToClear; while (NS_SUCCEEDED(iter->HasMoreElements(&hasMore)) && hasMore) { nsCOMPtr<nsISupports> supports; rv = iter->GetNext(getter_AddRefs(supports)); if (NS_FAILED(rv)) { continue; } // $profileDir/gmp/id/$hash nsCOMPtr<nsIFile> dirEntry(do_QueryInterface(supports, &rv)); if (NS_FAILED(rv)) { continue; } // Skip non-directory files. bool isDirectory = false; rv = dirEntry->IsDirectory(&isDirectory); if (NS_FAILED(rv) || !isDirectory) { continue; } if (!aFilter(dirEntry)) { continue; } nsAutoCString salt; if (NS_SUCCEEDED(ReadSalt(dirEntry, salt))) { // Keep node IDs to clear data/plugins associated with them later. nodeIDsToClear.AppendElement(salt); // Also remove node IDs from the table. mPersistentStorageAllowed.Remove(salt); } // Now we can remove the directory for the origin pair. if (NS_FAILED(dirEntry->Remove(true))) { NS_WARNING("Failed to delete the directory for the origin pair"); } } // Kill plugins that have node IDs to be cleared. KillPlugins(mPlugins, mMutex, NodeFilter(nodeIDsToClear)); // Clear all matching $profileDir/gmp/storage/$nodeId/ rv = GetStorageDir(getter_AddRefs(path)); if (NS_FAILED(rv)) { return; } rv = path->AppendNative(NS_LITERAL_CSTRING("storage")); if (NS_FAILED(rv)) { return; } for (size_t i = 0; i < nodeIDsToClear.Length(); i++) { nsCOMPtr<nsIFile> dirEntry; rv = path->Clone(getter_AddRefs(dirEntry)); if (NS_FAILED(rv)) { continue; } rv = dirEntry->AppendNative(nodeIDsToClear[i]); if (NS_FAILED(rv)) { continue; } if (NS_FAILED(DeleteDir(dirEntry))) { NS_WARNING("Failed to delete GMP storage directory for the node"); } } }