Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / gcm_internals_ui.cc
index be9fe84..bc560a8 100644 (file)
@@ -4,10 +4,13 @@
 
 #include "chrome/browser/ui/webui/gcm_internals_ui.h"
 
+#include <vector>
+
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/format_macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "chrome/browser/profiles/profile.h"
 
 namespace {
 
+void SetCheckinInfo(
+    const std::vector<gcm::GCMStatsRecorder::CheckinActivity>& checkins,
+    base::ListValue* checkin_info) {
+  std::vector<gcm::GCMStatsRecorder::CheckinActivity>::const_iterator it =
+      checkins.begin();
+  for (; it < checkins.end(); ++it) {
+    base::ListValue* row = new base::ListValue();
+    checkin_info->Append(row);
+
+    row->AppendDouble(it->time.ToJsTime());
+    row->AppendString(it->event);
+    row->AppendString(it->details);
+  }
+}
+
+void SetConnectionInfo(
+    const std::vector<gcm::GCMStatsRecorder::ConnectionActivity>& connections,
+    base::ListValue* connection_info) {
+  std::vector<gcm::GCMStatsRecorder::ConnectionActivity>::const_iterator it =
+      connections.begin();
+  for (; it < connections.end(); ++it) {
+    base::ListValue* row = new base::ListValue();
+    connection_info->Append(row);
+
+    row->AppendDouble(it->time.ToJsTime());
+    row->AppendString(it->event);
+    row->AppendString(it->details);
+  }
+}
+
+void SetRegistrationInfo(
+    const std::vector<gcm::GCMStatsRecorder::RegistrationActivity>&
+        registrations,
+    base::ListValue* registration_info) {
+  std::vector<gcm::GCMStatsRecorder::RegistrationActivity>::const_iterator it =
+      registrations.begin();
+  for (; it < registrations.end(); ++it) {
+    base::ListValue* row = new base::ListValue();
+    registration_info->Append(row);
+
+    row->AppendDouble(it->time.ToJsTime());
+    row->AppendString(it->app_id);
+    row->AppendString(it->sender_ids);
+    row->AppendString(it->event);
+    row->AppendString(it->details);
+  }
+}
+
+void SetReceivingInfo(
+    const std::vector<gcm::GCMStatsRecorder::ReceivingActivity>& receives,
+    base::ListValue* receive_info) {
+  std::vector<gcm::GCMStatsRecorder::ReceivingActivity>::const_iterator it =
+      receives.begin();
+  for (; it < receives.end(); ++it) {
+    base::ListValue* row = new base::ListValue();
+    receive_info->Append(row);
+
+    row->AppendDouble(it->time.ToJsTime());
+    row->AppendString(it->app_id);
+    row->AppendString(it->from);
+    row->AppendString(base::StringPrintf("%d", it->message_byte_size));
+    row->AppendString(it->event);
+    row->AppendString(it->details);
+  }
+}
+
+void SetSendingInfo(
+    const std::vector<gcm::GCMStatsRecorder::SendingActivity>& sends,
+    base::ListValue* send_info) {
+  std::vector<gcm::GCMStatsRecorder::SendingActivity>::const_iterator it =
+     sends.begin();
+  for (; it < sends.end(); ++it) {
+    base::ListValue* row = new base::ListValue();
+    send_info->Append(row);
+
+    row->AppendDouble(it->time.ToJsTime());
+    row->AppendString(it->app_id);
+    row->AppendString(it->receiver_id);
+    row->AppendString(it->message_id);
+    row->AppendString(it->event);
+    row->AppendString(it->details);
+  }
+}
+
 // Class acting as a controller of the chrome://gcm-internals WebUI.
 class GcmInternalsUIMessageHandler : public content::WebUIMessageHandler {
  public:
@@ -42,6 +129,9 @@ class GcmInternalsUIMessageHandler : public content::WebUIMessageHandler {
   // Request all of the GCM related infos through gcm profile service.
   void RequestAllInfo(const base::ListValue* args);
 
+  // Enables/disables GCM activity recording through gcm profile service.
+  void SetRecording(const base::ListValue* args);
+
   // Callback function of the request for all gcm related infos.
   void RequestGCMStatisticsFinished(
       const gcm::GCMClient::GCMStatistics& args) const;
@@ -76,16 +166,51 @@ void GcmInternalsUIMessageHandler::ReturnResults(
                             profile_service->IsGCMClientReady());
   }
   if (stats) {
+    results.SetBoolean("isRecording", stats->is_recording);
     device_info->SetBoolean("gcmClientCreated", stats->gcm_client_created);
     device_info->SetString("gcmClientState", stats->gcm_client_state);
     device_info->SetBoolean("connectionClientCreated",
                             stats->connection_client_created);
+    device_info->SetString("registeredAppIds",
+                           JoinString(stats->registered_app_ids, ","));
     if (stats->connection_client_created)
       device_info->SetString("connectionState", stats->connection_state);
     if (stats->android_id > 0) {
       device_info->SetString("androidId",
           base::StringPrintf("0x%" PRIx64, stats->android_id));
     }
+    device_info->SetInteger("sendQueueSize", stats->send_queue_size);
+    device_info->SetInteger("resendQueueSize", stats->resend_queue_size);
+
+    if (stats->recorded_activities.checkin_activities.size() > 0) {
+      base::ListValue* checkin_info = new base::ListValue();
+      results.Set("checkinInfo", checkin_info);
+      SetCheckinInfo(stats->recorded_activities.checkin_activities,
+                     checkin_info);
+    }
+    if (stats->recorded_activities.connection_activities.size() > 0) {
+      base::ListValue* connection_info = new base::ListValue();
+      results.Set("connectionInfo", connection_info);
+      SetConnectionInfo(stats->recorded_activities.connection_activities,
+                        connection_info);
+    }
+    if (stats->recorded_activities.registration_activities.size() > 0) {
+      base::ListValue* registration_info = new base::ListValue();
+      results.Set("registrationInfo", registration_info);
+      SetRegistrationInfo(stats->recorded_activities.registration_activities,
+                          registration_info);
+    }
+    if (stats->recorded_activities.receiving_activities.size() > 0) {
+      base::ListValue* receive_info = new base::ListValue();
+      results.Set("receiveInfo", receive_info);
+      SetReceivingInfo(stats->recorded_activities.receiving_activities,
+                       receive_info);
+    }
+    if (stats->recorded_activities.sending_activities.size() > 0) {
+      base::ListValue* send_info = new base::ListValue();
+      results.Set("sendInfo", send_info);
+      SetSendingInfo(stats->recorded_activities.sending_activities, send_info);
+    }
   }
   web_ui()->CallJavascriptFunction("gcmInternals.setGcmInternalsInfo",
                                    results);
@@ -93,17 +218,61 @@ void GcmInternalsUIMessageHandler::ReturnResults(
 
 void GcmInternalsUIMessageHandler::RequestAllInfo(
     const base::ListValue* args) {
+  if (args->GetSize() != 1) {
+    NOTREACHED();
+    return;
+  }
+  bool clear_logs = false;
+  if (!args->GetBoolean(0, &clear_logs)) {
+    NOTREACHED();
+    return;
+  }
+
   Profile* profile = Profile::FromWebUI(web_ui());
   gcm::GCMProfileService* profile_service =
     gcm::GCMProfileServiceFactory::GetForProfile(profile);
 
   if (!profile_service) {
     ReturnResults(profile, NULL, NULL);
+  } else if (profile_service->SignedInUserName().empty()) {
+    ReturnResults(profile, profile_service, NULL);
   } else {
-    profile_service->RequestGCMStatistics(base::Bind(
-        &GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
-        weak_ptr_factory_.GetWeakPtr()));
+    profile_service->GetGCMStatistics(
+        base::Bind(&GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
+                   weak_ptr_factory_.GetWeakPtr()),
+        clear_logs);
+  }
+}
+
+void GcmInternalsUIMessageHandler::SetRecording(const base::ListValue* args) {
+  if (args->GetSize() != 1) {
+    NOTREACHED();
+    return;
   }
+  bool recording = false;
+  if (!args->GetBoolean(0, &recording)) {
+    NOTREACHED();
+    return;
+  }
+
+  Profile* profile = Profile::FromWebUI(web_ui());
+  gcm::GCMProfileService* profile_service =
+      gcm::GCMProfileServiceFactory::GetForProfile(profile);
+
+  if (!profile_service) {
+    ReturnResults(profile, NULL, NULL);
+    return;
+  }
+  if (profile_service->SignedInUserName().empty()) {
+    ReturnResults(profile, profile_service, NULL);
+    return;
+  }
+  // Get fresh stats after changing recording setting.
+  profile_service->SetGCMRecording(
+      base::Bind(
+          &GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished,
+          weak_ptr_factory_.GetWeakPtr()),
+      recording);
 }
 
 void GcmInternalsUIMessageHandler::RequestGCMStatisticsFinished(
@@ -120,7 +289,11 @@ void GcmInternalsUIMessageHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
       "getGcmInternalsInfo",
       base::Bind(&GcmInternalsUIMessageHandler::RequestAllInfo,
-                 base::Unretained(this)));
+                 weak_ptr_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      "setGcmInternalsRecording",
+      base::Bind(&GcmInternalsUIMessageHandler::SetRecording,
+                 weak_ptr_factory_.GetWeakPtr()));
 }
 
 }  // namespace