15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/drive_internals_ui.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/debug_info_collector.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/drive_integration_service.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/job_list.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/logging.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/drive/drive_api_util.h" 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/drive_notification_manager.h" 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/drive_notification_manager_factory.h" 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/drive_service_interface.h" 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/drive/drive_switches.h" 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/drive/event_logger.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h" 34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h" 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/auth_service.h" 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h" 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_wapi_parser.h" 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/time_util.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets metadata of all files and directories in |root_path| 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recursively. Stores the result as a list of dictionaries like: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// [{ path: 'GCache/v1/tmp/<local_id>', 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// size: 12345, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is_directory: false, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// last_modified: '2005-08-09T09:57:00-08:00', 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// },...] 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The list is sorted by the path. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetGCacheContents(const base::FilePath& root_path, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* gcache_contents, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* gcache_summary) { 65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI)); 66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(gcache_contents); 67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(gcache_summary); 68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use this map to sort the result list by the path. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<base::FilePath, DictionaryValue*> files; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int options = (base::FileEnumerator::FILES | 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator::DIRECTORIES | 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator::SHOW_SYM_LINKS); 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator enumerator(root_path, true /* recursive */, options); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 total_size = 0; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::FilePath current = enumerator.Next(); !current.empty(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current = enumerator.Next()) { 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator::FileInfo info = enumerator.GetInfo(); 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 size = info.GetSize(); 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const bool is_directory = info.IsDirectory(); 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const bool is_symbolic_link = base::IsLink(info.GetName()); 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::Time last_modified = info.GetLastModifiedTime(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* entry = new base::DictionaryValue; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetString("path", current.value()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use double instead of integer for large files. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetDouble("size", size); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetBoolean("is_directory", is_directory); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetBoolean("is_symbolic_link", is_symbolic_link); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->SetString( 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last_modified", 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_apis::util::FormatTimeAsStringLocaltime(last_modified)); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Print lower 9 bits in octal format. 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry->SetString( 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "permission", 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::StringPrintf("%03o", info.stat().st_mode & 0x1ff)); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files[current] = entry; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size += size; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert |files| into |gcache_contents|. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::map<base::FilePath, DictionaryValue*>::const_iterator 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter = files.begin(); iter != files.end(); ++iter) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcache_contents->Append(iter->second); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcache_summary->SetDouble("total_size", total_size); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the available disk space for the path |home_path|. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetFreeDiskSpace(const base::FilePath& home_path, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* local_storage_summary) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(local_storage_summary); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int64 free_space = base::SysInfo::AmountOfFreeDiskSpace(home_path); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_storage_summary->SetDouble("free_space", free_space); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Formats |entry| into text. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string FormatEntry(const base::FilePath& path, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::ResourceEntry& entry) { 126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 127b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using base::StringAppendF; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string out; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, "%s\n", path.AsUTF8Unsafe().c_str()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " title: %s\n", entry.title().c_str()); 1338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) StringAppendF(&out, " local_id: %s\n", entry.local_id().c_str()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " resource_id: %s\n", entry.resource_id().c_str()); 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StringAppendF(&out, " parent_local_id: %s\n", 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) entry.parent_local_id().c_str()); 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) StringAppendF(&out, " shared: %s\n", entry.shared() ? "true" : "false"); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringAppendF(&out, " shared_with_me: %s\n", 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry.shared_with_me() ? "true" : "false"); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const drive::PlatformFileInfoProto& file_info = entry.file_info(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " file_info\n"); 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StringAppendF(&out, " size: %" PRId64 "\n", file_info.size()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " is_directory: %d\n", file_info.is_directory()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " is_symbolic_link: %d\n", 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info.is_symbolic_link()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time last_modified = base::Time::FromInternalValue( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info.last_modified()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time last_accessed = base::Time::FromInternalValue( 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info.last_accessed()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time creation_time = base::Time::FromInternalValue( 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_info.creation_time()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " last_modified: %s\n", 155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) google_apis::util::FormatTimeAsString(last_modified).c_str()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " last_accessed: %s\n", 157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) google_apis::util::FormatTimeAsString(last_accessed).c_str()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " creation_time: %s\n", 159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) google_apis::util::FormatTimeAsString(creation_time).c_str()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.has_file_specific_info()) { 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const drive::FileSpecificInfo& file_specific_info = 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry.file_specific_info(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " alternate_url: %s\n", 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_specific_info.alternate_url().c_str()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " content_mime_type: %s\n", 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_specific_info.content_mime_type().c_str()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " file_md5: %s\n", 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_specific_info.md5().c_str()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " document_extension: %s\n", 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_specific_info.document_extension().c_str()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringAppendF(&out, " is_hosted_document: %d\n", 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_specific_info.is_hosted_document()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entry.has_directory_specific_info()) { 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringAppendF(&out, " directory_info\n"); 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const drive::DirectorySpecificInfo& directory_specific_info = 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entry.directory_specific_info(); 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StringAppendF(&out, " changestamp: %" PRId64 "\n", 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) directory_specific_info.changestamp()); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)std::string SeverityToString(logging::LogSeverity severity) { 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (severity) { 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case logging::LOG_INFO: 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return "info"; 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case logging::LOG_WARNING: 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return "warning"; 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case logging::LOG_ERROR: 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return "error"; 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) default: // Treat all other higher severities as ERROR. 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return "error"; 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class to handle messages from chrome://drive-internals. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DriveInternalsWebUIHandler : public content::WebUIMessageHandler { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DriveInternalsWebUIHandler() 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : last_sent_event_id_(-1), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_(this) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DriveInternalsWebUIHandler() { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebUIMessageHandler override. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterMessages() OVERRIDE; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns a DriveIntegrationService. 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drive::DriveIntegrationService* GetIntegrationService(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns a DriveService instance. 21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::DriveServiceInterface* GetDriveService(); 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns a FileSystem instance. 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::FileSystemInterface* GetFileSystem(); 22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the page is first loaded. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPageLoaded(const base::ListValue* args); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates respective sections. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDriveRelatedFlagsSection(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDriveRelatedPreferencesSection(); 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void UpdateConnectionStatusSection( 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveServiceInterface* drive_service); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateAboutResourceSection( 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveServiceInterface* drive_service); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateAppListSection( 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveServiceInterface* drive_service); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateLocalMetadataSection( 237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive::DebugInfoCollector* debug_info_collector); 238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void UpdateDeltaUpdateStatusSection( 239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive::DebugInfoCollector* debug_info_collector); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdateInFlightOperationsSection(drive::JobListInterface* job_list); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateGCacheContentsSection(); 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdateFileSystemContentsSection(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateLocalStorageUsageSection(); 244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void UpdateCacheContentsSection( 245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive::DebugInfoCollector* debug_info_collector); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdateEventLogSection(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when GetGCacheContents() is complete. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGetGCacheContents(base::ListValue* gcache_contents, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* cache_summary); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Called when GetResourceEntryByPath() is complete. 253a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void OnGetResourceEntryByPath(const base::FilePath& path, 254a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) drive::FileError error, 255a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<drive::ResourceEntry> entry); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when ReadDirectoryByPath() is complete. 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnReadDirectoryByPath(const base::FilePath& parent_path, 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::FileError error, 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<drive::ResourceEntryVector> entries); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Called as the iterator for DebugInfoCollector::IterateFileCache(). 2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void UpdateCacheEntry(const std::string& local_id, 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::FileCacheEntry& cache_entry); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when GetFreeDiskSpace() is complete. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGetFreeDiskSpace(base::DictionaryValue* local_storage_summary); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when GetAboutResource() call to DriveService is complete. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetAboutResource( 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_apis::GDataErrorCode status, 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<google_apis::AboutResource> about_resource); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when GetAppList() call to DriveService is complete. 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetAppList( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_apis::GDataErrorCode status, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<google_apis::AppList> app_list); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback for DebugInfoCollector::GetMetadata for local update. 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetFilesystemMetadataForLocal( 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::FileSystemMetadata& metadata); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback for DebugInfoCollector::GetMetadata for delta update. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGetFilesystemMetadataForDeltaUpdate( 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::FileSystemMetadata& metadata); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the page requests periodic update. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPeriodicUpdate(const base::ListValue* args); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called when the corresponding button on the page is pressed. 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ClearAccessToken(const base::ListValue* args); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ClearRefreshToken(const base::ListValue* args); 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ReloadDriveFileSystem(const base::ListValue* args); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ListFileEntries(const base::ListValue* args); 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called after file system reload for ReloadDriveFileSystem is done. 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ReloadFinished(bool success); 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The last event sent to the JavaScript side. 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int last_sent_event_id_; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<DriveInternalsWebUIHandler> weak_ptr_factory_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DriveInternalsWebUIHandler); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::OnGetAboutResource( 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_apis::GDataErrorCode status, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<google_apis::AboutResource> parsed_about_resource) { 309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status != google_apis::HTTP_SUCCESS) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Failed to get about resource"; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(parsed_about_resource); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue about_resource; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) about_resource.SetDouble("account-quota-total", 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parsed_about_resource->quota_bytes_total()); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) about_resource.SetDouble("account-quota-used", 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parsed_about_resource->quota_bytes_used()); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) about_resource.SetDouble("account-largest-changestamp-remote", 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parsed_about_resource->largest_change_id()); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) about_resource.SetString("root-resource-id", 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parsed_about_resource->root_folder_id()); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->CallJavascriptFunction("updateAboutResource", about_resource); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::OnGetAppList( 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_apis::GDataErrorCode status, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<google_apis::AppList> parsed_app_list) { 333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status != google_apis::HTTP_SUCCESS) { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Failed to get app list"; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(parsed_app_list); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue app_list; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_list.SetString("etag", parsed_app_list->etag()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* items = new base::ListValue(); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < parsed_app_list->items().size(); ++i) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const google_apis::AppResource* app = parsed_app_list->items()[i]; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* app_data = new base::DictionaryValue(); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_data->SetString("name", app->name()); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_data->SetString("application_id", app->application_id()); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_data->SetString("object_type", app->object_type()); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_data->SetBoolean("supports_create", app->supports_create()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) items->Append(app_data); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_list.Set("items", items); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->CallJavascriptFunction("updateAppList", app_list); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::RegisterMessages() { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pageLoaded", 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnPageLoaded, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "periodicUpdate", 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnPeriodicUpdate, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->RegisterMessageCallback( 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "clearAccessToken", 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::ClearAccessToken, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->RegisterMessageCallback( 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "clearRefreshToken", 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::ClearRefreshToken, 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_ui()->RegisterMessageCallback( 378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "reloadDriveFileSystem", 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::ReloadDriveFileSystem, 380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_ui()->RegisterMessageCallback( 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "listFileEntries", 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::ListFileEntries, 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)drive::DriveIntegrationService* 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)DriveInternalsWebUIHandler::GetIntegrationService() { 389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) drive::DriveIntegrationService* service = 393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) drive::DriveIntegrationServiceFactory::FindForProfile(profile); 394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!service || !service->is_enabled()) 395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return NULL; 396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return service; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)drive::DriveServiceInterface* DriveInternalsWebUIHandler::GetDriveService() { 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return drive::util::GetDriveServiceByProfile(profile); 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)drive::FileSystemInterface* DriveInternalsWebUIHandler::GetFileSystem() { 40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return drive::util::GetFileSystemByProfile(profile); 41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::OnPageLoaded(const base::ListValue* args) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drive::DriveIntegrationService* integration_service = 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetIntegrationService(); 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |integration_service| may be NULL in the guest/incognito mode. 41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!integration_service) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveServiceInterface* drive_service = 42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) integration_service->drive_service(); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drive_service); 425b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive::DebugInfoCollector* debug_info_collector = 42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) integration_service->debug_info_collector(); 427b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(debug_info_collector); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDriveRelatedFlagsSection(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDriveRelatedPreferencesSection(); 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UpdateConnectionStatusSection(drive_service); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAboutResourceSection(drive_service); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAppListSection(drive_service); 434b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) UpdateLocalMetadataSection(debug_info_collector); 435b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) UpdateDeltaUpdateStatusSection(debug_info_collector); 43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UpdateInFlightOperationsSection(integration_service->job_list()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateGCacheContentsSection(); 438b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) UpdateCacheContentsSection(debug_info_collector); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateLocalStorageUsageSection(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When the drive-internals page is reloaded by the reload key, the page 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content is recreated, but this WebUI object is not (instead, OnPageLoaded 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is called again). In that case, we have to forget the last sent ID here, 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and resent whole the logs to the page. 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_event_id_ = -1; 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateEventLogSection(); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::UpdateDriveRelatedFlagsSection() { 450b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 451b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kDriveRelatedFlags[] = { 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::switches::kEnableDriveV2Api, 454b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) chromeos::switches::kDisableDrive, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue flags; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kDriveRelatedFlags); ++i) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string key = kDriveRelatedFlags[i]; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value = "(not set)"; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(key)) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(key); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* flag = new DictionaryValue; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flag->SetString("key", key); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flag->SetString("value", value.empty() ? "(set)" : value); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags.Append(flag); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateDriveRelatedFlags", flags); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::UpdateDriveRelatedPreferencesSection() { 473b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 474b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* kDriveRelatedPreferences[] = { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDisableDrive, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDisableDriveOverCellular, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kDisableDriveHostedFiles, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service = profile->GetPrefs(); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue preferences; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kDriveRelatedPreferences); ++i) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string key = kDriveRelatedPreferences[i]; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As of now, all preferences are boolean. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string value = 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pref_service->GetBoolean(key.c_str()) ? "true" : "false"); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* preference = new DictionaryValue; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preference->SetString("key", key); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preference->SetString("value", value); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferences.Append(preference); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateDriveRelatedPreferences", 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferences); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void DriveInternalsWebUIHandler::UpdateConnectionStatusSection( 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveServiceInterface* drive_service) { 502b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drive_service); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string status; 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (drive::util::GetDriveConnectionStatus(Profile::FromWebUI(web_ui()))) { 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case drive::util::DRIVE_DISCONNECTED_NOSERVICE: 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status = "no service"; 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case drive::util::DRIVE_DISCONNECTED_NONETWORK: 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status = "no network"; 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case drive::util::DRIVE_DISCONNECTED_NOTREADY: 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status = "not ready"; 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case drive::util::DRIVE_CONNECTED_METERED: 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status = "metered"; 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case drive::util::DRIVE_CONNECTED: 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) status = "connected"; 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::DictionaryValue connection_status; 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) connection_status.SetString("status", status); 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) connection_status.SetBoolean("has-refresh-token", 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) drive_service->HasRefreshToken()); 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) connection_status.SetBoolean("has-access-token", 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) drive_service->HasAccessToken()); 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateConnectionStatus", connection_status); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::UpdateAboutResourceSection( 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveServiceInterface* drive_service) { 535b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drive_service); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drive_service->GetAboutResource( 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnGetAboutResource, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::UpdateAppListSection( 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveServiceInterface* drive_service) { 545b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drive_service); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drive_service->GetAppList( 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnGetAppList, 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::UpdateLocalMetadataSection( 554b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive::DebugInfoCollector* debug_info_collector) { 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 556b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(debug_info_collector); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 558b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) debug_info_collector->GetMetadata( 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnGetFilesystemMetadataForLocal, 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::OnGetFilesystemMetadataForLocal( 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::FileSystemMetadata& metadata) { 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue local_metadata; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_metadata.SetDouble("account-largest-changestamp-local", 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata.largest_changestamp); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_metadata.SetBoolean("account-metadata-refreshing", metadata.refreshing); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateLocalMetadata", local_metadata); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::ClearAccessToken(const base::ListValue* args) { 575b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 576b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::DriveServiceInterface* drive_service = GetDriveService(); 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (drive_service) 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive_service->ClearAccessToken(); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::ClearRefreshToken( 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* args) { 584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::DriveServiceInterface* drive_service = GetDriveService(); 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (drive_service) 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive_service->ClearRefreshToken(); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DriveInternalsWebUIHandler::ReloadDriveFileSystem( 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::ListValue* args) { 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) drive::DriveIntegrationService* integration_service = 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetIntegrationService(); 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (integration_service) { 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) integration_service->ClearCacheAndRemountFileSystem( 599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::ReloadFinished, 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DriveInternalsWebUIHandler::ReloadFinished(bool success) { 605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_ui()->CallJavascriptFunction("updateReloadStatus", 608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FundamentalValue(success)); 609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DriveInternalsWebUIHandler::ListFileEntries(const base::ListValue* args) { 612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 613b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateFileSystemContentsSection(); 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DriveInternalsWebUIHandler::UpdateDeltaUpdateStatusSection( 618b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive::DebugInfoCollector* debug_info_collector) { 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(debug_info_collector); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) debug_info_collector->GetMetadata( 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &DriveInternalsWebUIHandler::OnGetFilesystemMetadataForDeltaUpdate, 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DriveInternalsWebUIHandler::OnGetFilesystemMetadataForDeltaUpdate( 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::FileSystemMetadata& metadata) { 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch drive::DriveNotificationManager* drive_notification_manager = 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::DriveNotificationManagerFactory::GetForBrowserContext(profile); 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!drive_notification_manager) 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue delta_update_status; 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delta_update_status.SetBoolean( 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "push-notification-enabled", 641b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive_notification_manager->push_notification_enabled()); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_update_status.SetString( 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last-update-check-time", 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_apis::util::FormatTimeAsStringLocaltime( 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata.last_update_check_time)); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_update_status.SetString( 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last-update-check-error", 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::FileErrorToString(metadata.last_update_check_error)); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateDeltaUpdateStatus", 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_update_status); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::UpdateInFlightOperationsSection( 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::JobListInterface* job_list) { 656b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 657b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(job_list); 658b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<drive::JobInfo> info_list = job_list->GetJobInfoList(); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue in_flight_operations; 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < info_list.size(); ++i) { 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::JobInfo& info = info_list[i]; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* dict = new DictionaryValue; 666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetInteger("id", info.job_id); 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetString("type", drive::JobTypeToString(info.job_type)); 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetString("file_path", info.file_path.AsUTF8Unsafe()); 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetString("state", drive::JobStateToString(info.state)); 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetDouble("progress_current", info.num_completed_bytes); 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetDouble("progress_total", info.num_total_bytes); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_flight_operations.Append(dict); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateInFlightOperations", 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_flight_operations); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::UpdateGCacheContentsSection() { 679b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 680b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start updating the GCache contents section. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath root_path = drive::util::GetCacheRootPath(profile); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* gcache_contents = new ListValue; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* gcache_summary = new DictionaryValue; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostBlockingPoolTaskAndReply( 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetGCacheContents, 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_path, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcache_contents, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gcache_summary), 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnGetGCacheContents, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Owned(gcache_contents), 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Owned(gcache_summary))); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DriveInternalsWebUIHandler::UpdateFileSystemContentsSection() { 699b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 700b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 70158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::DriveServiceInterface* drive_service = GetDriveService(); 70258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::FileSystemInterface* file_system = GetFileSystem(); 70358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!drive_service || !file_system) 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 70558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start updating the file system tree section, if we have access token. 70758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!drive_service->HasAccessToken()) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start rendering the file system tree as text. 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath root_path = drive::util::GetDriveGrandRootPath(); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system->GetResourceEntry( 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_path, 715a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnGetResourceEntryByPath, 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_path)); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system->ReadDirectory( 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_path, 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnReadDirectoryByPath, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_path)); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::UpdateLocalStorageUsageSection() { 727b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 728b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Propagate the amount of local free space in bytes. 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath home_path; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PathService::Get(base::DIR_HOME, &home_path)) { 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* local_storage_summary = new DictionaryValue; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostBlockingPoolTaskAndReply( 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetFreeDiskSpace, home_path, local_storage_summary), 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnGetFreeDiskSpace, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Owned(local_storage_summary))); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Home directory not found"; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 744b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DriveInternalsWebUIHandler::UpdateCacheContentsSection( 745b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drive::DebugInfoCollector* debug_info_collector) { 746b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 747b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(debug_info_collector); 748b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 749b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) debug_info_collector->IterateFileCache( 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::UpdateCacheEntry, 751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&base::DoNothing)); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DriveInternalsWebUIHandler::UpdateEventLogSection() { 756b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 757b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<drive::EventLogger::Event> log = 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::util::GetLogHistory(); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue list; 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < log.size(); ++i) { 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Skip events which were already sent. 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (log[i].id <= last_sent_event_id_) 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string severity = SeverityToString(log[i].severity); 768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* dict = new DictionaryValue; 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("key", 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_apis::util::FormatTimeAsStringLocaltime(log[i].when)); 772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict->SetString("value", "[" + severity + "] " + log[i].what); 773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict->SetString("class", "log-" + severity); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list.Append(dict); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_event_id_ = log[i].id; 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!list.empty()) 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->CallJavascriptFunction("updateEventLog", list); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::OnGetGCacheContents( 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* gcache_contents, 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* gcache_summary) { 784b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(gcache_contents); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(gcache_summary); 787b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateGCacheContents", 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *gcache_contents, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *gcache_summary); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 793a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void DriveInternalsWebUIHandler::OnGetResourceEntryByPath( 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::FileError error, 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<drive::ResourceEntry> entry) { 797b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 798b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (error == drive::FILE_ERROR_OK) { 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(entry.get()); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringValue value(FormatEntry(path, *entry) + "\n"); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateFileSystemContents", value); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::OnReadDirectoryByPath( 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& parent_path, 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::FileError error, 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<drive::ResourceEntryVector> entries) { 810b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 811b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (error == drive::FILE_ERROR_OK) { 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(entries.get()); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drive::FileSystemInterface* file_system = GetFileSystem(); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string file_system_as_text; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < entries->size(); ++i) { 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::ResourceEntry& entry = (*entries)[i]; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath current_path = parent_path.Append( 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(entry.base_name())); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_as_text.append(FormatEntry(current_path, entry) + "\n"); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry.file_info().is_directory()) { 825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system->ReadDirectory( 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path, 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DriveInternalsWebUIHandler::OnReadDirectoryByPath, 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_path)); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There may be pending ReadDirectoryByPath() calls, but we can update 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page with what we have now. This results in progressive 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updates, which is good for a large file system. 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringValue value(file_system_as_text); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateFileSystemContents", value); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::UpdateCacheEntry( 8428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& local_id, 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const drive::FileCacheEntry& cache_entry) { 844b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 845b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert |cache_entry| into a dictionary. 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue value; 8488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) value.SetString("local_id", local_id); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetString("md5", cache_entry.md5()); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetBoolean("is_present", cache_entry.is_present()); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetBoolean("is_pinned", cache_entry.is_pinned()); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.SetBoolean("is_dirty", cache_entry.is_dirty()); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateCacheContents", value); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::OnGetFreeDiskSpace( 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* local_storage_summary) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(local_storage_summary); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction( 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "updateLocalStorageUsage", *local_storage_summary); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DriveInternalsWebUIHandler::OnPeriodicUpdate(const base::ListValue* args) { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) drive::DriveIntegrationService* integration_service = 87090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetIntegrationService(); 87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |integration_service| may be NULL in the guest/incognito mode. 87290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!integration_service) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UpdateInFlightOperationsSection(integration_service->job_list()); 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateEventLogSection(); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DriveInternalsUI::DriveInternalsUI(content::WebUI* web_ui) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : WebUIController(web_ui) { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->AddMessageHandler(new DriveInternalsWebUIHandler()); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource* source = 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Create(chrome::kChromeUIDriveInternalsHost); 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddResourcePath("drive_internals.css", IDR_DRIVE_INTERNALS_CSS); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddResourcePath("drive_internals.js", IDR_DRIVE_INTERNALS_JS); 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->SetDefaultResource(IDR_DRIVE_INTERNALS_HTML); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Add(profile, source); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 896