diff options
-rw-r--r-- | base/file_util.cc | 18 | ||||
-rw-r--r-- | base/file_util.h | 9 | ||||
-rw-r--r-- | base/file_util_unittest.cc | 6 | ||||
-rw-r--r-- | chrome/browser/profile.cc | 63 |
4 files changed, 91 insertions, 5 deletions
diff --git a/base/file_util.cc b/base/file_util.cc index b24ffde..5ce4456 100644 --- a/base/file_util.cc +++ b/base/file_util.cc @@ -268,6 +268,24 @@ int64 ComputeDirectorySize(const FilePath& root_path) { return running_size; } +int64 ComputeFilesSize(const FilePath& directory, + const FilePath::StringType& pattern) { + int64 running_size = 0; + FileEnumerator file_iter(directory, false, FileEnumerator::FILES, pattern); + for (FilePath current = file_iter.Next(); !current.empty(); + current = file_iter.Next()) { + FileEnumerator::FindInfo info; + file_iter.GetFindInfo(&info); +#if defined(OS_WIN) + LARGE_INTEGER li = { info.nFileSizeLow, info.nFileSizeHigh }; + running_size += li.QuadPart; +#else + running_size += info.stat.st_size; +#endif + } + return running_size; +} + /////////////////////////////////////////////// // MemoryMappedFile diff --git a/base/file_util.h b/base/file_util.h index 04afdec..b2e176b 100644 --- a/base/file_util.h +++ b/base/file_util.h @@ -82,6 +82,15 @@ int CountFilesCreatedAfter(const FilePath& path, // particularly speedy in any platform. int64 ComputeDirectorySize(const FilePath& root_path); +// Returns the total number of bytes used by all files matching the provided +// |pattern|, on this |directory| (without recursion). If the path does not +// exist the function returns 0. +// +// This function is implemented using the FileEnumerator class so it is not +// particularly speedy in any platform. +int64 ComputeFilesSize(const FilePath& directory, + const FilePath::StringType& pattern); + // Deletes the given path, whether it's a file or a directory. // If it's a directory, it's perfectly happy to delete all of the // directory's contents. Passing true to recursive deletes diff --git a/base/file_util_unittest.cc b/base/file_util_unittest.cc index 219b63d..39e5398 100644 --- a/base/file_util_unittest.cc +++ b/base/file_util_unittest.cc @@ -463,6 +463,12 @@ TEST_F(FileUtilTest, FileAndDirectorySize) { int64 computed_size = file_util::ComputeDirectorySize(test_dir_); EXPECT_EQ(size_f1 + size_f2 + 3, computed_size); + + computed_size = file_util::ComputeFilesSize(test_dir_, FPL("The file*")); + EXPECT_EQ(size_f1, computed_size); + + computed_size = file_util::ComputeFilesSize(test_dir_, FPL("bla*")); + EXPECT_EQ(0, computed_size); } TEST_F(FileUtilTest, NormalizeFilePathBasic) { diff --git a/chrome/browser/profile.cc b/chrome/browser/profile.cc index 6a2e9b7..ea689e6 100644 --- a/chrome/browser/profile.cc +++ b/chrome/browser/profile.cc @@ -179,6 +179,56 @@ bool IncludeDefaultApps() { #endif return false; } + +// Simple task to log the size of the current profile. +class ProfileSizeTask : public Task { + public: + explicit ProfileSizeTask(const FilePath& path) : path_(path) {} + virtual ~ProfileSizeTask() {} + + virtual void Run(); + private: + FilePath path_; +}; + +void ProfileSizeTask::Run() { + int64 size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("*")); + int size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.TotalSize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("History")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.HistorySize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("History*")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.TotalHistorySize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("Cookies")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.CookiesSize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("Bookmarks")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.BookmarksSize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("Thumbnails")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.ThumbnailsSize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("Visited Links")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.VisitedLinksSize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("Web Data")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.WebDataSize", size_MB); + + size = file_util::ComputeFilesSize(path_, FILE_PATH_LITERAL("Extension*")); + size_MB = static_cast<int>(size / (1024 * 1024)); + UMA_HISTOGRAM_COUNTS_10000("Profile.ExtensionSize", size_MB); +} + } // namespace // A pointer to the request context for the default profile. See comments on @@ -262,11 +312,10 @@ class OffTheRecordProfileImpl : public Profile, } virtual ~OffTheRecordProfileImpl() { - NotificationService::current()->Notify( - NotificationType::PROFILE_DESTROYED, - Source<Profile>(this), - NotificationService::NoDetails()); - CleanupRequestContext(request_context_); + NotificationService::current()->Notify(NotificationType::PROFILE_DESTROYED, + Source<Profile>(this), + NotificationService::NoDetails()); + CleanupRequestContext(request_context_); } virtual ProfileId GetRuntimeId() { @@ -749,6 +798,10 @@ ProfileImpl::ProfileImpl(const FilePath& path) #endif pinned_tab_service_.reset(new PinnedTabService(this)); + + // Log the profile size after a reasonable startup delay. + ChromeThread::PostDelayedTask(ChromeThread::FILE, FROM_HERE, + new ProfileSizeTask(path_), 112000); } void ProfileImpl::InitExtensions() { |