Index: chrome/browser/ui/webui/chromeos/provided_file_systems_ui.cc |
diff --git a/chrome/browser/ui/webui/chromeos/provided_file_systems_ui.cc b/chrome/browser/ui/webui/chromeos/provided_file_systems_ui.cc |
index 1dbbe441617f878e428336f5cb50d070f9bf6b98..ed682b2b6bd4757f287a2faa9a65439e90395a02 100644 |
--- a/chrome/browser/ui/webui/chromeos/provided_file_systems_ui.cc |
+++ b/chrome/browser/ui/webui/chromeos/provided_file_systems_ui.cc |
@@ -4,9 +4,12 @@ |
#include "chrome/browser/ui/webui/chromeos/provided_file_systems_ui.h" |
+#include <string> |
#include <vector> |
#include "base/bind.h" |
+#include "base/files/file.h" |
+#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
#include "base/values.h" |
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h" |
@@ -28,12 +31,58 @@ namespace chromeos { |
namespace { |
+const char kKeyId[] = "id"; |
+const char kKeyEventType[] = "eventType"; |
+const char kKeyRequestType[] = "requestType"; |
+const char kKeyTime[] = "time"; |
+const char kKeyHasMore[] = "hasMore"; |
+const char kKeyError[] = "error"; |
+ |
+const char kKeyName[] = "name"; |
+const char kKeyExtensionId[] = "extensionId"; |
+const char kKeyMountPath[] = "mountPath"; |
+const char kKeyActiveRequests[] = "activeRequests"; |
+ |
+const char kRequestCreated[] = "created"; |
+const char kRequestDestroyed[] = "destroyed"; |
+const char kRequestExecuted[] = "executed"; |
+const char kRequestFulfilled[] = "fulfilled"; |
+const char kRequestRejected[] = "rejected"; |
+const char kRequestTimeouted[] = "timeouted"; |
+ |
+const char kFunctionOnRequestEvent[] = "onRequestEvent"; |
+const char kFunctionUpdateFileSystems[] = "updateFileSystems"; |
+const char kFunctionSelectFileSystem[] = "selectFileSystem"; |
+ |
+// Creates a dictionary holding common fields for the onRequest* events. |
+scoped_ptr<base::DictionaryValue> CreateRequestEvent(const std::string& type, |
+ int request_id) { |
+ scoped_ptr<base::DictionaryValue> event(new base::DictionaryValue); |
+ event->SetInteger(kKeyId, request_id); |
+ event->SetString(kKeyEventType, type); |
+ event->SetDouble(kKeyTime, base::Time::Now().ToJsTime()); |
+ return event.Pass(); |
+} |
+ |
// Class to handle messages from chrome://provided-file-systems. |
-class ProvidedFileSystemsWebUIHandler : public content::WebUIMessageHandler { |
+class ProvidedFileSystemsWebUIHandler |
+ : public content::WebUIMessageHandler, |
+ public file_system_provider::RequestManager::Observer { |
public: |
ProvidedFileSystemsWebUIHandler() : weak_ptr_factory_(this) {} |
- virtual ~ProvidedFileSystemsWebUIHandler() {} |
+ virtual ~ProvidedFileSystemsWebUIHandler(); |
+ |
+ // RequestManager::Observer overrides. |
+ virtual void OnRequestCreated( |
+ int request_id, |
+ file_system_provider::RequestType type) OVERRIDE; |
+ virtual void OnRequestDestroyed(int request_id) OVERRIDE; |
+ virtual void OnRequestExecuted(int request_id) OVERRIDE; |
+ virtual void OnRequestFulfilled(int request_id, bool has_more) OVERRIDE; |
+ virtual void OnRequestRejected(int request_id, |
+ base::File::Error error) OVERRIDE; |
+ virtual void OnRequestTimeouted(int request_id) OVERRIDE; |
private: |
// content::WebUIMessageHandler overrides. |
@@ -44,17 +93,89 @@ class ProvidedFileSystemsWebUIHandler : public content::WebUIMessageHandler { |
file_system_provider::Service* GetService(); |
// Invoked when updating file system list is requested. |
- void OnUpdateFileSystems(const base::ListValue* args); |
+ void UpdateFileSystems(const base::ListValue* args); |
+ // Invoked when a file system is selected from the list. |
+ void SelectFileSystem(const base::ListValue* args); |
+ |
+ std::string selected_extension_id; |
+ std::string selected_file_system_id; |
base::WeakPtrFactory<ProvidedFileSystemsWebUIHandler> weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(ProvidedFileSystemsWebUIHandler); |
}; |
+ProvidedFileSystemsWebUIHandler::~ProvidedFileSystemsWebUIHandler() { |
+ // Stop observing the currently selected file system. |
+ file_system_provider::Service* const service = GetService(); |
+ if (!service) |
+ return; |
+ |
+ file_system_provider::ProvidedFileSystemInterface* const file_system = |
+ service->GetProvidedFileSystem(selected_extension_id, |
+ selected_file_system_id); |
+ |
+ if (file_system) { |
+ file_system_provider::RequestManager* const request_manager = |
+ file_system->GetRequestManager(); |
+ DCHECK(request_manager); |
+ request_manager->RemoveObserver(this); |
+ } |
+} |
+ |
+void ProvidedFileSystemsWebUIHandler::OnRequestCreated( |
+ int request_id, |
+ file_system_provider::RequestType type) { |
+ scoped_ptr<base::DictionaryValue> const event = |
+ CreateRequestEvent(kRequestCreated, request_id); |
+ event->SetString(kKeyRequestType, |
+ file_system_provider::RequestTypeToString(type)); |
+ web_ui()->CallJavascriptFunction(kFunctionOnRequestEvent, *event); |
+} |
+ |
+void ProvidedFileSystemsWebUIHandler::OnRequestDestroyed(int request_id) { |
+ scoped_ptr<base::DictionaryValue> const event = |
+ CreateRequestEvent(kRequestDestroyed, request_id); |
+ web_ui()->CallJavascriptFunction(kFunctionOnRequestEvent, *event); |
+} |
+ |
+void ProvidedFileSystemsWebUIHandler::OnRequestExecuted(int request_id) { |
+ scoped_ptr<base::DictionaryValue> const event = |
+ CreateRequestEvent(kRequestExecuted, request_id); |
+ web_ui()->CallJavascriptFunction(kFunctionOnRequestEvent, *event); |
+} |
+ |
+void ProvidedFileSystemsWebUIHandler::OnRequestFulfilled(int request_id, |
+ bool has_more) { |
+ scoped_ptr<base::DictionaryValue> const event = |
+ CreateRequestEvent(kRequestFulfilled, request_id); |
+ event->SetBoolean(kKeyHasMore, has_more); |
+ web_ui()->CallJavascriptFunction(kFunctionOnRequestEvent, *event); |
+} |
+ |
+void ProvidedFileSystemsWebUIHandler::OnRequestRejected( |
+ int request_id, |
+ base::File::Error error) { |
+ scoped_ptr<base::DictionaryValue> const event = |
+ CreateRequestEvent(kRequestRejected, request_id); |
+ event->SetString(kKeyError, base::File::ErrorToString(error)); |
+ web_ui()->CallJavascriptFunction(kFunctionOnRequestEvent, *event); |
+} |
+ |
+void ProvidedFileSystemsWebUIHandler::OnRequestTimeouted(int request_id) { |
+ scoped_ptr<base::DictionaryValue> const event = |
+ CreateRequestEvent(kRequestTimeouted, request_id); |
+ web_ui()->CallJavascriptFunction(kFunctionOnRequestEvent, *event); |
+} |
+ |
void ProvidedFileSystemsWebUIHandler::RegisterMessages() { |
web_ui()->RegisterMessageCallback( |
- "updateFileSystems", |
- base::Bind(&ProvidedFileSystemsWebUIHandler::OnUpdateFileSystems, |
+ kFunctionUpdateFileSystems, |
+ base::Bind(&ProvidedFileSystemsWebUIHandler::UpdateFileSystems, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ web_ui()->RegisterMessageCallback( |
+ kFunctionSelectFileSystem, |
+ base::Bind(&ProvidedFileSystemsWebUIHandler::SelectFileSystem, |
weak_ptr_factory_.GetWeakPtr())); |
} |
@@ -65,7 +186,7 @@ file_system_provider::Service* ProvidedFileSystemsWebUIHandler::GetService() { |
return file_system_provider::ServiceFactory::FindExisting(profile); |
} |
-void ProvidedFileSystemsWebUIHandler::OnUpdateFileSystems( |
+void ProvidedFileSystemsWebUIHandler::UpdateFileSystems( |
const base::ListValue* args) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
@@ -91,19 +212,63 @@ void ProvidedFileSystemsWebUIHandler::OnUpdateFileSystems( |
file_system->GetRequestManager(); |
DCHECK(request_manager); |
- base::DictionaryValue* item_value = new base::DictionaryValue(); |
- item_value->SetString("id", file_system_info.file_system_id()); |
- item_value->SetString("name", file_system_info.file_system_name()); |
- item_value->SetString("extensionId", file_system_info.extension_id()); |
- item_value->SetString("mountPath", |
- file_system_info.mount_path().AsUTF8Unsafe()); |
- item_value->SetInteger("activeRequests", |
- request_manager->GetActiveRequestsForLogging()); |
+ base::DictionaryValue* item = new base::DictionaryValue(); |
+ item->SetString(kKeyId, file_system_info.file_system_id()); |
+ item->SetString(kKeyName, file_system_info.file_system_name()); |
+ item->SetString(kKeyExtensionId, file_system_info.extension_id()); |
+ item->SetString(kKeyMountPath, |
+ file_system_info.mount_path().AsUTF8Unsafe()); |
+ item->SetInteger(kKeyActiveRequests, |
+ request_manager->GetActiveRequestsForLogging()); |
+ |
+ items.Append(item); |
+ } |
+ |
+ web_ui()->CallJavascriptFunction(kFunctionUpdateFileSystems, items); |
+} |
+ |
+void ProvidedFileSystemsWebUIHandler::SelectFileSystem( |
+ const base::ListValue* args) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ file_system_provider::Service* const service = GetService(); |
+ if (!service) |
+ return; |
+ |
+ std::string extension_id; |
+ if (!args->GetString(0, &extension_id)) |
+ return; |
- items.Append(item_value); |
+ std::string file_system_id; |
+ if (!args->GetString(1, &file_system_id)) |
+ return; |
+ |
+ // Stop observing the previously selected request manager. |
+ { |
+ file_system_provider::ProvidedFileSystemInterface* const file_system = |
+ service->GetProvidedFileSystem(selected_extension_id, |
+ selected_file_system_id); |
+ if (file_system) { |
+ file_system_provider::RequestManager* const request_manager = |
+ file_system->GetRequestManager(); |
+ DCHECK(request_manager); |
+ request_manager->RemoveObserver(this); |
+ } |
} |
- web_ui()->CallJavascriptFunction("updateFileSystems", items); |
+ // Observe the selected file system. |
+ file_system_provider::ProvidedFileSystemInterface* const file_system = |
+ service->GetProvidedFileSystem(extension_id, file_system_id); |
+ if (!file_system) |
+ return; |
+ |
+ file_system_provider::RequestManager* const request_manager = |
+ file_system->GetRequestManager(); |
+ DCHECK(request_manager); |
+ |
+ request_manager->AddObserver(this); |
+ selected_extension_id = extension_id; |
+ selected_file_system_id = file_system_id; |
} |
} // namespace |