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