17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <map>
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bind.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bind_helpers.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/values.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/extensions/api/sync_file_system/sync_file_system_api_helpers.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_system_service.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_system_service_factory.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/web_ui.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using sync_file_system::RemoteFileSyncService;
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using sync_file_system::SyncFileSystemServiceFactory;
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using sync_file_system::SyncServiceState;
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace syncfs_internals {
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)FileMetadataHandler::FileMetadataHandler(Profile* profile)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : profile_(profile),
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      weak_factory_(this) {}
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)FileMetadataHandler::~FileMetadataHandler() {}
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FileMetadataHandler::RegisterMessages() {
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "getExtensions",
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&FileMetadataHandler::GetExtensions,
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(this)));
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  web_ui()->RegisterMessageCallback(
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "getFileMetadata",
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&FileMetadataHandler::GetFileMetadata,
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 base::Unretained(this)));
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FileMetadataHandler::GetFileMetadata(
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::ListValue* args) {
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string extension_id;
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!args->GetString(0, &extension_id) || extension_id.empty()) {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LOG(WARNING) << "GetFileMetadata() Extension ID wasn't given";
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Extension ID from JS is just the host. Need to reformat it to chrome
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // extension type GURL.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const GURL origin = extensions::Extension::GetBaseURLFromExtensionId(
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension_id);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Get all metadata for the one specific origin.
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  sync_file_system::SyncFileSystemService* sync_service =
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      SyncFileSystemServiceFactory::GetForProfile(profile_);
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!sync_service)
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  sync_service->DumpFiles(origin,
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                          base::Bind(&FileMetadataHandler::DidGetFileMetadata,
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                     weak_factory_.GetWeakPtr()));
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FileMetadataHandler::GetExtensions(const base::ListValue* args) {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(args);
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionStatusesHandler::GetExtensionStatusesAsDictionary(
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      profile_,
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&FileMetadataHandler::DidGetExtensions,
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FileMetadataHandler::DidGetExtensions(const base::ListValue& list) {
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  web_ui()->CallJavascriptFunction("FileMetadata.onGetExtensions", list);
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FileMetadataHandler::DidGetFileMetadata(const base::ListValue& files) {
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  web_ui()->CallJavascriptFunction("FileMetadata.onGetFileMetadata", files);
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace syncfs_internals
84